Plugin Directory

Changeset 2118094


Ignore:
Timestamp:
07/05/2019 12:34:54 PM (7 years ago)
Author:
gtanyware
Message:

V2.4.3 Refactor to make tokenizer faster

Location:
easycoder/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • easycoder/trunk/easycoder-min.js

    r2110632 r2118094  
    1 var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(d,h,g){d!=Array.prototype&&d!=Object.prototype&&(d[h]=g.value)};$jscomp.getGlobal=function(d){return"undefined"!=typeof window&&window===d?d:"undefined"!=typeof global&&null!=global?global:d};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_";
    2 $jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var d=0;return function(h){return $jscomp.SYMBOL_PREFIX+(h||"")+d++}}();
    3 $jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var d=$jscomp.global.Symbol.iterator;d||(d=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[d]&&$jscomp.defineProperty(Array.prototype,d,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(d){var h=0;return $jscomp.iteratorPrototype(function(){return h<d.length?{done:!1,value:d[h++]}:{done:!0}})};
    4 $jscomp.iteratorPrototype=function(d){$jscomp.initSymbolIterator();d={next:d};d[$jscomp.global.Symbol.iterator]=function(){return this};return d};$jscomp.makeIterator=function(d){$jscomp.initSymbolIterator();var h=d[Symbol.iterator];return h?h.call(d):$jscomp.arrayIterator(d)};$jscomp.owns=function(d,h){return Object.prototype.hasOwnProperty.call(d,h)};
    5 $jscomp.assign="function"==typeof Object.assign?Object.assign:function(d,h){for(var g=1;g<arguments.length;g++){var f=arguments[g];if(f)for(var b in f)$jscomp.owns(f,b)&&(d[b]=f[b])}return d};$jscomp.polyfill=function(d,h,g,f){if(h){g=$jscomp.global;d=d.split(".");for(f=0;f<d.length-1;f++){var b=d[f];b in g||(g[b]={});g=g[b]}d=d[d.length-1];f=g[d];h=h(f);h!=f&&null!=h&&$jscomp.defineProperty(g,d,{configurable:!0,writable:!0,value:h})}};
    6 $jscomp.polyfill("Object.assign",function(d){return d||$jscomp.assign},"es6","es3");$jscomp.iteratorFromArray=function(d,h){$jscomp.initSymbolIterator();d instanceof String&&(d+="");var g=0,f={next:function(){if(g<d.length){var b=g++;return{value:h(b,d[b]),done:!1}}f.next=function(){return{done:!0,value:void 0}};return f.next()}};f[Symbol.iterator]=function(){return f};return f};
    7 $jscomp.polyfill("Array.prototype.keys",function(d){return d?d:function(){return $jscomp.iteratorFromArray(this,function(d){return d})}},"es6","es3");$jscomp.checkStringArgs=function(d,h,g){if(null==d)throw new TypeError("The 'this' value for String.prototype."+g+" must not be null or undefined");if(h instanceof RegExp)throw new TypeError("First argument to String.prototype."+g+" must not be a regular expression");return d+""};
    8 $jscomp.polyfill("String.prototype.endsWith",function(d){return d?d:function(d,g){var f=$jscomp.checkStringArgs(this,d,"endsWith");d+="";void 0===g&&(g=f.length);g=Math.max(0,Math.min(g|0,f.length));for(var b=d.length;0<b&&0<g;)if(f[--g]!=d[--b])return!1;return 0>=b}},"es6","es3");$jscomp.polyfill("Object.is",function(d){return d?d:function(d,g){return d===g?0!==d||1/d===1/g:d!==d&&g!==g}},"es6","es3");
    9 $jscomp.polyfill("Array.prototype.includes",function(d){return d?d:function(d,g){var f=this;f instanceof String&&(f=String(f));var b=f.length;g=g||0;for(0>g&&(g=Math.max(g+b,0));g<b;g++){var a=f[g];if(a===d||Object.is(a,d))return!0}return!1}},"es7","es3");$jscomp.polyfill("String.prototype.includes",function(d){return d?d:function(d,g){return-1!==$jscomp.checkStringArgs(this,d,"includes").indexOf(d,g||0)}},"es6","es3");
    10 $jscomp.polyfill("Math.trunc",function(d){return d?d:function(d){d=Number(d);if(isNaN(d)||Infinity===d||-Infinity===d||0===d)return d;var h=Math.floor(Math.abs(d));return 0>d?-h:h}},"es6","es3");$jscomp.polyfill("String.prototype.repeat",function(d){return d?d:function(d){var h=$jscomp.checkStringArgs(this,null,"repeat");if(0>d||1342177279<d)throw new RangeError("Invalid count value");d|=0;for(var f="";d;)if(d&1&&(f+=h),d>>>=1)h+=h;return f}},"es6","es3");
    11 $jscomp.stringPadding=function(d,h){d=void 0!==d?String(d):" ";return 0<h&&d?d.repeat(Math.ceil(h/d.length)).substring(0,h):""};$jscomp.polyfill("String.prototype.padStart",function(d){return d?d:function(d,g){var f=$jscomp.checkStringArgs(this,null,"padStart");return $jscomp.stringPadding(g,d-f.length)+f}},"es8","es3");$jscomp.polyfill("Number.isFinite",function(d){return d?d:function(d){return"number"!==typeof d?!1:!isNaN(d)&&Infinity!==d&&-Infinity!==d}},"es6","es3");
     1var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(d,k,h){d!=Array.prototype&&d!=Object.prototype&&(d[k]=h.value)};$jscomp.getGlobal=function(d){return"undefined"!=typeof window&&window===d?d:"undefined"!=typeof global&&null!=global?global:d};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX="jscomp_symbol_";
     2$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.Symbol=function(){var d=0;return function(k){return $jscomp.SYMBOL_PREFIX+(k||"")+d++}}();
     3$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var d=$jscomp.global.Symbol.iterator;d||(d=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[d]&&$jscomp.defineProperty(Array.prototype,d,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(d){var k=0;return $jscomp.iteratorPrototype(function(){return k<d.length?{done:!1,value:d[k++]}:{done:!0}})};
     4$jscomp.iteratorPrototype=function(d){$jscomp.initSymbolIterator();d={next:d};d[$jscomp.global.Symbol.iterator]=function(){return this};return d};$jscomp.makeIterator=function(d){$jscomp.initSymbolIterator();var k=d[Symbol.iterator];return k?k.call(d):$jscomp.arrayIterator(d)};$jscomp.owns=function(d,k){return Object.prototype.hasOwnProperty.call(d,k)};
     5$jscomp.assign="function"==typeof Object.assign?Object.assign:function(d,k){for(var h=1;h<arguments.length;h++){var f=arguments[h];if(f)for(var c in f)$jscomp.owns(f,c)&&(d[c]=f[c])}return d};$jscomp.polyfill=function(d,k,h,f){if(k){h=$jscomp.global;d=d.split(".");for(f=0;f<d.length-1;f++){var c=d[f];c in h||(h[c]={});h=h[c]}d=d[d.length-1];f=h[d];k=k(f);k!=f&&null!=k&&$jscomp.defineProperty(h,d,{configurable:!0,writable:!0,value:k})}};
     6$jscomp.polyfill("Object.assign",function(d){return d||$jscomp.assign},"es6","es3");$jscomp.iteratorFromArray=function(d,k){$jscomp.initSymbolIterator();d instanceof String&&(d+="");var h=0,f={next:function(){if(h<d.length){var c=h++;return{value:k(c,d[c]),done:!1}}f.next=function(){return{done:!0,value:void 0}};return f.next()}};f[Symbol.iterator]=function(){return f};return f};
     7$jscomp.polyfill("Array.prototype.keys",function(d){return d?d:function(){return $jscomp.iteratorFromArray(this,function(d){return d})}},"es6","es3");$jscomp.checkStringArgs=function(d,k,h){if(null==d)throw new TypeError("The 'this' value for String.prototype."+h+" must not be null or undefined");if(k instanceof RegExp)throw new TypeError("First argument to String.prototype."+h+" must not be a regular expression");return d+""};
     8$jscomp.polyfill("String.prototype.endsWith",function(d){return d?d:function(d,h){var f=$jscomp.checkStringArgs(this,d,"endsWith");d+="";void 0===h&&(h=f.length);h=Math.max(0,Math.min(h|0,f.length));for(var c=d.length;0<c&&0<h;)if(f[--h]!=d[--c])return!1;return 0>=c}},"es6","es3");$jscomp.polyfill("Object.is",function(d){return d?d:function(d,h){return d===h?0!==d||1/d===1/h:d!==d&&h!==h}},"es6","es3");
     9$jscomp.polyfill("Array.prototype.includes",function(d){return d?d:function(d,h){var f=this;f instanceof String&&(f=String(f));var c=f.length;h=h||0;for(0>h&&(h=Math.max(h+c,0));h<c;h++){var a=f[h];if(a===d||Object.is(a,d))return!0}return!1}},"es7","es3");$jscomp.polyfill("String.prototype.includes",function(d){return d?d:function(d,h){return-1!==$jscomp.checkStringArgs(this,d,"includes").indexOf(d,h||0)}},"es6","es3");
     10$jscomp.polyfill("Math.trunc",function(d){return d?d:function(d){d=Number(d);if(isNaN(d)||Infinity===d||-Infinity===d||0===d)return d;var k=Math.floor(Math.abs(d));return 0>d?-k:k}},"es6","es3");$jscomp.polyfill("String.prototype.repeat",function(d){return d?d:function(d){var k=$jscomp.checkStringArgs(this,null,"repeat");if(0>d||1342177279<d)throw new RangeError("Invalid count value");d|=0;for(var f="";d;)if(d&1&&(f+=k),d>>>=1)k+=k;return f}},"es6","es3");
     11$jscomp.stringPadding=function(d,k){d=void 0!==d?String(d):" ";return 0<k&&d?d.repeat(Math.ceil(k/d.length)).substring(0,k):""};$jscomp.polyfill("String.prototype.padStart",function(d){return d?d:function(d,h){var f=$jscomp.checkStringArgs(this,null,"padStart");return $jscomp.stringPadding(h,d-f.length)+f}},"es8","es3");$jscomp.polyfill("Number.isFinite",function(d){return d?d:function(d){return"number"!==typeof d?!1:!isNaN(d)&&Infinity!==d&&-Infinity!==d}},"es6","es3");
    1212$jscomp.polyfill("Number.isInteger",function(d){return d?d:function(d){return Number.isFinite(d)?d===Math.floor(d):!1}},"es6","es3");
    13 (function(){function d(h,g,f){function b(c,m){if(!g[c]){if(!h[c]){var e="function"==typeof require&&require;if(!m&&e)return e(c,!0);if(a)return a(c,!0);m=Error("Cannot find module '"+c+"'");throw m.code="MODULE_NOT_FOUND",m;}m=g[c]={exports:{}};h[c][0].call(m.exports,function(a){return b(h[c][1][a]||a)},m,m.exports,d,h,g,f)}return g[c].exports}for(var a="function"==typeof require&&require,c=0;c<f.length;c++)b(f[c]);return b}return d})()({1:[function(d,h,g){var f=d("./easycoder/Main");f.version="2.4.2";
    14 f.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");window.onload=function(){console.log(Date.now()-f.timestamp+" ms: Page loaded; reset timer & start EasyCoder");f.timestamp=Date.now();f.scripts={};window.EasyCoder=f;var b=document.getElementById("easycoder-script");if(b){b.style.display="none";try{f.start(b.innerText)}catch(a){f.reportError(a)}}}},{"./easycoder/Main":6}],2:[function(d,h,g){h.exports=function(d,b,a){b=d.value.evaluate(d,b);d=d.value.evaluate(d,a);a=b.content;
    15 var c=d.content;a&&b.numeric?d.numeric||(c="undefined"===typeof c?0:parseInt(c)):(c&&d.numeric&&(c=c.toString()),"undefined"===typeof a&&(a=""),"undefined"===typeof c&&(c=""));return a>c?1:a<c?-1:0}},{}],3:[function(d,h,g){var f=Object.assign||function(a){for(var c=1;c<arguments.length;c++){var b=arguments[c],d;for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(a[d]=b[d])}return a},b=this,a={getTokens:function(){return b.tokens},addWarning:function(a){b.warnings.push(a)},warning:function(c){a.addWarning(c)},
    16 unrecognisedSymbol:function(c){a.addWarning("Unrecognised symbol '"+c+"'")},getWarnings:function(){return b.warnings},getIndex:function(){return b.index},next:function(a){b.index+=void 0===a?1:a},peek:function(){return b.tokens[b.index+1].token},more:function(){return b.index<b.tokens.length},getToken:function(){return b.index>=b.tokens.length?null:b.tokens[b.index]?b.tokens[b.index].token:null},nextToken:function(){a.next();return a.getToken()},tokenIs:function(a){return b.index>=b.tokens.length?
    17 !1:a===b.tokens[b.index].token},nextTokenIs:function(c){a.next();return a.tokenIs(c)},skip:function(c){if(b.index>=b.tokens.length)return null;a.next();a.tokenIs(c)&&a.next()},prev:function(){b.index--},getLino:function(){return b.index>=b.tokens.length?0:b.tokens[b.index].lino},getTarget:function(a){a=void 0===a?b.index:a;return b.tokens[a].token},getTargetPc:function(c){c=void 0===c?b.index:c;return b.symbols[a.getTarget(c)].pc},getCommandAt:function(a){return b.program[a]},isSymbol:function(c){c=
    18 void 0===c?!1:c;if(a.getTarget()in b.symbols)return!0;if(c)throw Error("Unknown symbol: '"+a.getTarget()+"'");return!1},nextIsSymbol:function(c){c=void 0===c?!1:c;a.next();return a.isSymbol(c)},getSymbol:function(){return b.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){var c=b.program[a.getSymbolPc()];c.used=!0;return c},getSymbols:function(){return b.symbols},getProgram:function(){return b.program},getPc:function(){return b.program.length},getValue:function(){return a.value.compile(a)},
    19 getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(c,e){return a.value.constant(c,void 0===e?!1:e)},addCommand:function(a){b.program.push(f({pc:b.program.length},a))},addSymbol:function(a,e){b.symbols[a]={pc:e}},mark:function(){b.savedMark=b.index},rewind:function(){b.index=b.savedMark},rewindTo:function(a){b.index=a},completeHandler:function(){var c=a.getLino(),e=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:c,
    20 goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});a.getCommandAt(e).goto=a.getPc();return!0},compileVariable:function(c,e,m,d){m=void 0===m?!1:m;d=void 0===d?null:d;a.next();var p=a.getLino(),l=a.getTokens()[a.getIndex()];if(b.symbols[l.token])throw Error("Duplicate variable name '"+l.token+"'");var n=a.getPc();a.next();a.addSymbol(l.token,n);c={domain:c,keyword:e,lino:p,isSymbol:!0,used:!1,isValueHolder:m,name:l.token,elements:1,index:0,value:[{}],element:[],extra:d};
    21 "dom"===d&&(c.element=[]);a.addCommand(c);return c},compileToken:function(){var c=a.getToken();if(c){a.mark();for(var e=$jscomp.makeIterator(Object.keys(a.domain)),b=e.next();!b.done;b=e.next()){if((b=a.domain[b.value])&&(b=b.getHandler(c))&&b.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+c+"...'");}},compileOne:function(){var c=a.getToken();if(c){b.warnings=[];var e=b.program.length;if(c.endsWith(":")){c=c.substring(0,c.length-1);if(b.symbols[c])throw Error("Duplicate symbol: '"+
    22 c+"'");b.symbols[c]={pc:e};b.index++}else a.compileToken()}},compileFromHere:function(c){for(;b.index<b.tokens.length;){var e=b.tokens[b.index].token;if("else"===e)return b.program;a.compileOne();if(-1<c.indexOf(e))break}},compile:function(c){b.tokens=c;b.index=0;b.program=[];b.symbols={};b.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"exit",lino:a.getLino(),next:0});for(var e in b.symbols)c=b.program[b.symbols[e].pc],c.isSymbol&&!c.used&&console.log("Symbol '"+c.name+"' has not been used.");
    23 return b.program}};h.exports=a},{}],4:[function(d,h,g){var f=Object.assign||function(b){for(var a=1;a<arguments.length;a++){var c=arguments[a],e;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(b[e]=c[e])}return b};h.exports={compile:function(b){b.mark();for(var a=$jscomp.makeIterator(Object.keys(b.domain)),c=a.next();!c.done;c=a.next()){if(c=b.domain[c.value].condition.compile(b))return f({domain:name},c);b.rewind()}},test:function(b,a){return b.domain[a.domain].condition.test(b,a)}}},{}],
    24 5:[function(d,h,g){var f=this,b={Add:{compile:function(a){var c=a.getLino();a.next();var e=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var b=a.getSymbol();if(a.getCommandAt(b.pc).isValueHolder){if("giving"===a.peek()){b=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,value2:b,target:d})}else b=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,target:b});return!0}a.warning("core "+f.name+": Expected value holder")}else{b=
    25 a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:c,value1:e,value2:b,target:d}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];b?(a=a.getValue(b)+a.getValue(e),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c.lino),a=parseInt(f.content)+
    26 parseInt(a.getValue(e)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Alias:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var b=a.getSymbolRecord();b.used=!0;a.next();a.addCommand({domain:"core",keyword:"alias",lino:c,alias:e,symbol:b.name});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.symbols[c.alias].pc,b=a[e],d=a.getSymbolRecord(c.symbol);
    27 a[e]={pc:b.pc,domain:d.domain,keyword:d.keyword,lino:b.lino,name:b.name,alias:c.symbol};return c.pc+1}},Append:{compile:function(a){var c=a.getLino(),e=a.getNextValue();if(a.tokenIs("to")&&a.nextIsSymbol()){var b=a.getSymbolRecord();if(b.isValueHolder)return a.next(),a.addCommand({domain:"core",keyword:"append",lino:c,value:e,select:b.name}),!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.select);try{var b=a.getValue(c.value),d=["{","["].includes(b[0])?JSON.parse(b):b,f=e.value[e.index],
    28 l=f.content;l=l?JSON.parse(l):[];l.push(d);f.content=JSON.stringify(l);return c.pc+1}catch(n){return a.runtimeError(c.lino,"JSON: Unable to parse value"),!1}}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core","callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbolRecord();if(e.isValueHolder)return e=
    29 a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"clear",lino:c,symbol:e}),!0;a.warning("'Variable '"+e.name+"' does not hold a value")}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);e.isValueHolder?(a.domain[e.domain].value.put(e,{type:"boolean",content:!1}),c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Close:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if("module"===e.keyword)return a.next(),
    30 a.addCommand({domain:"core",keyword:"close",lino:c,module:e.name}),!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.module).program;a.run(a.onClose);return c.pc+1}},Debug:{compile:function(a){var c=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:c,item:e});return!0}a.addCommand({domain:"core",keyword:"debug",lino:c,item:"program"});return!0}return a.tokenIs("symbols")?
    31 (a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbols"}),!0):a.tokenIs("symbol")?(e=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"symbol",name:e}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:c,item:"step"}),!0):!1},run:function(a){var c=a[a.pc],e=c.item;switch(e){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(c.name);e=a.exporter;delete a.exporter;
    32 console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter=e;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=e.content&&console.log("Debug item "+e.content+": "+JSON.stringify(a[e.content],null,2))}return c.pc+1}},Decode:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],
    33 e=a.getSymbolRecord(c.symbol);if(e.isValueHolder){var b=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.decode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},Divide:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbol();var b=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,
    34 a.next(),a.addCommand({domain:"core",keyword:"divide",lino:c,value1:e,value2:d,target:b}),!0;a.warning("core "+f.name+": Expected value holder")}else return"undefined"===typeof b&&a.warning("core "+f.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];e?(a=a.getValue(e)/a.getValue(b),d.value[d.index]={type:"constant",
    35 numeric:!0,content:Math.trunc(a)}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c,lino),a=parseInt(f.content)/parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Dummy:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"dummy",lino:c});return!0},run:function(a){return a[a.pc].pc+1}},Encode:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=
    36 a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);if(e.isValueHolder){var b=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.encode(b)};c.numeric=!1}else a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"});
    37 return!0},run:function(a){a.exit();return 0}},Filter:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if(a.nextTokenIs("with")){var b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"filter",lino:c,array:e.name,func:b});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.array),b=e.value[e.index].content,d=a.getSymbolRecord(c.func).pc;try{var f=JSON.parse(b).filter(function(c){e.a=c;a.run(d);return e.v});e.value[e.index].content=
    38 JSON.stringify(f)}catch(l){a.runtimeError(c.lino,"Can't parse this array")}return c.pc+1}},Fork:{compile:function(a){var c=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];try{a.run(a.symbols[c.label].pc)}catch(e){console.log(e.message),alert(e.message)}return c.pc+1}},Go:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",
    39 keyword:"go",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];if(c.label){if(a.verifySymbol(c.label)){var e=a.symbols[c.label];if(e)return e.pc}a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}return c.goto}},Gosub:{compile:function(a){var c=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:c,label:e});return!0},run:function(a){var c=a[a.pc];if(a.verifySymbol(c.label))return a.stack.push(a.pc+1),a.symbols[c.label].pc;
    40 a.runtimeError(c.lino,"Unknown symbol '"+c.label+"'");return 0}},If:{compile:function(a){var c=a.getLino();a.next();var e=a.condition.compile(a),b=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:c,condition:e});a.compileOne();if(!a.getToken())return a.getCommandAt(b).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(b).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(b).else=a.getPc();
    41 return!0},run:function(a){var c=a[a.pc];return a.condition.test(a,c.condition)?c.pc+1:c.else}},Import:{compile:function(a){var c=a.imports,e=a.getProgram();if(c.length){c=$jscomp.makeIterator(c);for(var b=c.next();!b.done;b=c.next()){b=b.value;var d=a.nextToken(),f=b.keyword;if(d===f){if(d=a.compileVariable(b.domain,f,!0),d=e[a.getSymbols()[d.name].pc],d.element=b.element,d.exporter=b.exporter,d.exportedName=b.name,d.extra=b.extra,d.isValueHolder=b.isValueHolder,d.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+
    42 b.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");}else a.next();return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol(!0)){var e=a.getToken();if(a.nextTokenIs("to")){var b=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:c,symbol:e,value:b});return!0}}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol),b=a.getValue(c.value);b>=e.elements&&a.runtimeError(c.lino,"Array index "+b+" is out of range for '"+
    43 e.name+"'");e.index=b;e.imported&&(e.exporter.getSymbolRecord(e.exportedName).index=b);return c.pc+1}},Load:{compile:function(a){var c=a.getLino();switch(a.nextToken()){case "plugin":var e=a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:c,name:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getValue(c.name);switch(c.keyword){case "load":if(a.checkPlugin(e))return c.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,e,a.getPlugin,a.addLocalPlugin,function(){a.run(c.pc+
    44 1)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbol();var b=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return b=a.getSymbol(),b=a.getCommandAt(b.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:c,value1:e,
    45 value2:d,target:b}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof b&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply",lino:c,value2:d,target:b}),!0;return!1},run:function(a){var c=a[a.pc],e=c.value1,b=c.value2,d=a.getSymbolRecord(c.target);if(d.isValueHolder){var f=d.value[d.index];e?(a=a.getValue(e)*a.getValue(b),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(c,
    46 lino),a=parseInt(f.content)*parseInt(a.getValue(b)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,d.name);return c.pc+1}},Negate:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"negate",lino:c,symbol:e});return!0}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.symbol);e.isValueHolder?e.value[e.index]={type:"constant",numeric:!0,content:-e.value[e.index].content}:
    47 a.variableDoesNotHoldAValueError(c.lino,e.name);return c.pc+1}},On:{compile:function(a){var c=a.getLino(),e=a.nextToken();switch(e){case "close":case "restore":case "message":case "error":return a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:e}),a.completeHandler()}return a.isSymbol()&&(e=a.getSymbolRecord(),"callback"===e.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:c,action:e.name}),a.completeHandler()):!1},run:function(a){var c=a[a.pc],e=c.pc+2;switch(c.action){case "close":a.onClose=
    48 e;break;case "restore":a.onRestore=e;break;case "message":a.onMessage=e;break;case "error":a.onError=e;break;default:var b=a.getSymbolRecord(c.action);if(b)b.cb=e;else return a.runtimeError(c.lino,"Unknown action '"+c.action+"'"),0}return c.pc+1}},Print:{compile:function(a){var c=a.getLino();a.next();var e=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:c,value:e});return!0},run:function(a){var c=a[a.pc];a=a.getFormattedValue(c.value);console.log("-> "+a);return c.pc+1}},Put:{compile:function(a){var c=
    49 a.getLino(),e=a.getNextValue();if(a.tokenIs("into")){if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:c,value:e,target:b});return!0}a.warning("core:put: No such variable: '"+a.getToken()+"'")}return!1},run:function(a){var c=a[a.pc],e=a.getSymbolRecord(c.target);e.isValueHolder||a.variableDoesNotHoldAValueError(c.lino,e.name);a=a.evaluate(c.value);e.value[e.index]=a;e.imported&&(e=e.exporter.getSymbolRecord(e.exportedName),e.value[e.index]=a);return c.pc+
    50 1}},Replace:{compile:function(a){var c=a.getLino(),e=a.getNextValue();if(a.tokenIs("with")){var b=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var d=a.getSymbolRecord();a.next();if(d.isValueHolder)return a.addCommand({domain:"core",keyword:"replace",lino:c,original:e,replacement:b,target:d.name}),!0;throw Error("'"+d.name+"' does not hold a value");}}return!1},run:function(a){var c=a[a.pc],e=a.getValue(c.original),b=a.getValue(c.replacement),d=a.getSymbolRecord(c.target);a=a.getValue(d.value[d.index]).split(e).join(b);
    51 d.value[d.index]={type:"constant",numeric:!1,content:a};return c.pc+1}},Require:{compile:function(a){var c=a.getLino(),e=a.nextToken();if(["css","js"].includes(e)){var b=a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:c,type:e,url:b});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var c=a[a.pc];a.require(c.type,a.getValue(c.url),function(){a.run(c.pc+1)});return 0}},Return:{compile:function(a){var c=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",
    52 lino:c});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var c=a.getLino(),b=a.getNextValue(),d=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var f=a.getSymbolRecord();f.exporter=a.getProgram();d.push(f);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var g=a.getSymbolRecord();a.next();if("module"!==g.keyword)throw Error("'"+g.name+"' is not a module");g=g.name}var l=!1;a.tokenIs("nowait")&&(a.next(),l=!0);f=a.getPc();a.addCommand({domain:"core",
    53 keyword:"run",lino:c,script:b,imports:d,module:g,nowait:l,then:0});a.tokenIs("then")&&(c=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(f).then=a.getPc(),a.next(),a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(c).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",
    54 lino:c,name:b});return!0}return!1},run:function(a){var c=a[a.pc];a=a.getSymbolRecord(c.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return c.pc+1}},Script:{compile:function(a){var c=a.getLino(),b=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:c,name:b});return!0},run:function(a){var c=a[a.pc];a.script=c.name;EasyCoder.scripts[c.name]=a;console.log(Date.now()-EasyCoder.timestamp+" ms: Script: "+c.name);return c.pc+1}},Send:{compile:function(a){var c=
    55 a.getLino(),b="";a.nextTokenIs("to")||(b=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==d.keyword)throw Error("'"+d.name+"' is not a module");d=d.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:c,message:b,recipient:d})}return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.message);if("parent"===c.recipient){var d=a.parent;d&&a.parent.onMessage&&(d.message=b,d.run(d.onMessage))}else a=a.getSymbolRecord(c.recipient),
    56 a.program&&(a.program.message=b,a.program.run(a.program.onMessage));return c.pc+1}},Set:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(!b.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(k){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setArray",target:b.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:c,request:"setBoolean",target:b.name});return!0}switch(a.getToken()){case "ready":return a.next(),
    57 a.addCommand({domain:"core",keyword:"set",lino:c,request:"setReady"}),!0;case "property":b=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to"))){var f=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:c,request:"setProperty",target:d.name,name:b,value:f});return!0}break;case "arg":if(b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),a.nextTokenIs("to")))return f=a.getNextValue(),a.addCommand({domain:"core",
    58 keyword:"set",lino:c,request:"setArg",target:d.name,name:b,value:f}),!0}a.tokenIs("the")&&a.next();switch(a.getToken()){case "elements":a.next();if(a.tokenIs("of")){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");b=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:c,request:"setElements",symbol:b,value:d}),!0}break;case "encoding":if(a.nextTokenIs("to"))return b=a.getNextValue(),a.addCommand({domain:"core",
    59 keyword:"set",request:"encoding",lino:c,encoding:b}),!0;a.addWarning("Unknown encoding option");break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword&&a.nextTokenIs("to")))return d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:c,callback:b.name,payload:d}),!0}return!1},run:function(a){var c=a[a.pc];switch(c.request){case "setBoolean":var b=a.getSymbolRecord(c.target);b.isValueHolder?(b.value[b.index]={type:"boolean",
    60 content:!0},c.numeric=!1):a.variableDoesNotHoldAValueError(c.lino,b.name);break;case "setReady":a.parent.run(a.parent.nextPc);a.parent.nextPc=0;break;case "setElements":b=a.getSymbolRecord(c.symbol);var d=b.elements;b.elements=a.getValue(c.value);b.index=0;if(b.elements>d)for(a=d;a<b.elements;a++)b.value.push({}),b.element.push({});else b.value=b.value.slice(0,b.elements),b.element=b.element.slice(0,b.elements);break;case "setArray":b=a.getSymbolRecord(c.target);b.elements=c.value.length;b.value=
    61 c.value;break;case "encoding":a.encoding=a.getValue(c.encoding);break;case "setProperty":b=a.getSymbolRecord(c.target);var f=a.getValue(b.value[b.index]);f||(f="{}");d="";try{d=JSON.parse(f)}catch(k){return a.runtimeError(c.lino,"Can't parse "+b.name),0}f=a.getValue(c.name);if(a=a.evaluate(c.value))a.content instanceof Array?d[f]=a.content:"boolean"===a.type?d[f]=a.content:a.numeric?d[f]=a.content:'{"'===a.content.substr(0,2)?d[f]=JSON.parse(a.content):d[f]=a.content.split('"').join('\\"'),b.value[b.index]=
    62 {type:"constant",numeric:!1,content:JSON.stringify(d)};break;case "setPayload":a.getSymbolRecord(c.callback).payload=a.getValue(c.payload);break;case "setArg":d=a.getValue(c.name),b=a.getSymbolRecord(c.target),b[d]=a.getValue(c.value)}return c.pc+1}},Sort:{compile:function(a){var c=a.getLino();if(a.nextIsSymbol()){var b=a.getSymbolRecord();if(a.nextTokenIs("with")){var d=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"sort",lino:c,array:b.name,func:d});return!0}}return!1},run:function(a){var c=
    63 a[a.pc],b=a.getSymbolRecord(c.array),d=b.value[b.index].content,f=a.getSymbolRecord(c.func).pc;try{var g=JSON.parse(d);g.sort(function(c,e){b.a=c;b.b=e;a.run(f);return b.v});b.value[b.index].content=JSON.stringify(g)}catch(l){a.runtimeError(c.lino,"Can't parse this array")}return c.pc+1}},Stop:{compile:function(a){var c=a.getLino();a.next();if(a.more()&&a.isSymbol()){var b=a.getSymbolRecord();return"module"===b.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:c,name:b.name}),!0):
    64 !1}a.addCommand({domain:"core",keyword:"stop",lino:c,next:0});return!0},run:function(a){var c=a[a.pc];if(c.name)a.getSymbolRecord(c.name).program.exit();else return 0;return c.pc+1}},Take:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var g=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,
    65 target:g})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,target:d});return!0}a.warning("core "+f.name+": Expected value holder")}else{d=a.getValue();if(a.tokenIs("giving"))return a.next(),g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:c,value1:b,value2:d,target:g}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1},run:function(a){var c=a[a.pc],b=c.value1,d=c.value2,f=a.getSymbolRecord(c.target);if(f.isValueHolder){var g=
    66 f.value[f.index];d?(a=a.getValue(d)-a.getValue(b),f.value[f.index]={type:"constant",numeric:!0,content:a}):(!g.numeric&&isNaN(g.content)&&a.nonNumericValueError(c.lino),a=parseInt(a.getValue(g))-parseInt(a.getValue(b)),f.value[f.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(c.lino,f.name);return c.pc+1}},Toggle:{compile:function(a){var c=a.getLino();a.next();if(a.isSymbol()){var b=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:c,symbol:b});
    67 return!0}return!1},run:function(a){var c=a[a.pc],b=a[c.symbol];if(b.isValueHolder){var d=a.domain[b.domain];a=d.value.get(a,b.value[b.index]).content;d.value.put(b,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(c.lino,b.name);return c.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var c=a.getLino();a.next();var b=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();
    68 d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:c,value:b,multiplier:d});return!0},run:function(a){var c=a[a.pc],b=a.getValue(c.value);setTimeout(function(){a.run(c.pc+1)},b*c.multiplier);return 0}},While:{compile:function(a){var c=a.getLino();a.next();var b=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:c,condition:b});
    69 c=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(c).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return b.Add;case "alias":return b.Alias;case "append":return b.Append;case "begin":return b.Begin;case "callback":return b.Callback;case "clear":return b.Clear;case "close":return b.Close;case "debug":return b.Debug;
    70 case "decode":return b.Decode;case "divide":return b.Divide;case "dummy":return b.Dummy;case "encode":return b.Encode;case "end":return b.End;case "exit":return b.Exit;case "filter":return b.Filter;case "fork":return b.Fork;case "go":case "goto":return b.Go;case "gosub":return b.Gosub;case "if":return b.If;case "import":return b.Import;case "index":return b.Index;case "load":return b.Load;case "module":return b.Module;case "multiply":return b.Multiply;case "negate":return b.Negate;case "on":return b.On;
    71 case "print":return b.Print;case "put":return b.Put;case "replace":return b.Replace;case "require":return b.Require;case "return":return b.Return;case "run":return b.Run;case "sanitize":return b.Sanitize;case "script":return b.Script;case "send":return b.Send;case "set":return b.Set;case "sort":return b.Sort;case "stop":return b.Stop;case "take":return b.Take;case "toggle":return b.Toggle;case "variable":return b.Variable;case "wait":return b.Wait;case "while":return b.While;default:return!1}},run:function(a){var c=
    72 a[a.pc],d=b.getHandler(c.keyword);d||a.runtimeError(c.lino,"Unknown keyword '"+c.keyword+"' in 'core' package");return d.run(a)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var c=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",name:c};case "variable":var b=a.nextToken();return["format","modulo"].includes(b)?(a=a.getNextValue(),{domain:"core",type:b,name:c,value:a}):{domain:"core",
    73 type:"symbol",name:c}}return null}c=a.getToken();if("true"===c)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===c)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===c)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"cos",angle_c:c,radius_c:a};if("sin"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",
    74 angle_s:c,radius_s:a};if("tan"===c)return a.next(),c=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:c,radius_t:a};if("empty"===c)return a.next(),{domain:"core",type:"empty"};if(["now","today"].includes(c))return a.next(),{domain:"core",type:c};if("newline"===c)return a.next(),{domain:"core",type:"newline"};if("break"===c)return a.next(),{domain:"core",type:"break"};if(["encode","decode","lowercase","hash"].includes(c))return a.next(),a=a.getValue(),{domain:"core",type:c,
    75 value:a};if("element"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"element",element:c,symbol:b.name}:null;if("property"===c)return c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),a.next(),"variable"===b.keyword)?{domain:"core",type:"property",property:c,symbol:b.name}:null;if("arg"===c&&(c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()))return b=a.getSymbolRecord(),a.next(),
    76 {domain:"core",type:"arg",value:c,target:b.name};a.tokenIs("the")&&a.next();c=a.getToken();switch(c){case "elements":if(a.nextTokenIs("of")&&a.nextIsSymbol())return b=a.getToken(),a.next(),{domain:"core",type:c,name:b};break;case "index":if(a.nextTokenIs("of")){if(a.nextIsSymbol()){if("in"===a.peek())return c=a.getValue(),a=a.getNextValue(),{domain:"core",type:"indexOf",value1:c,value2:a};b=a.getToken();a.next();return{domain:"core",type:c,name:b}}c=a.getValue();if(a.tokenIs("in"))return a=a.getNextValue(),
    77 {domain:"core",type:"indexOf",value1:c,value2:a}}break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":b=a.getNextValue();if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:c,count:b,value:a};break;case "from":b=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=
    78 a.getNextValue(),{domain:"core",type:c,from:b,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(c=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),c=!0),b=a.getValue(),a.tokenIs("in")))return a=a.getNextValue(),{domain:"core",type:"position",needle:b,haystack:a,last:c};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),"callback"===c.keyword))return a.next(),{domain:"core",type:"payload",callback:c.name};break;case "message":case "error":return a.next(),
    79 {domain:"core",type:c}}return null},get:function(a,c){switch(c.type){case "boolean":return{type:"boolean",numeric:!1,content:c.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).elements};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(c.name).index};case "random":return a=a.evaluate(c.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var b=a.getValue(c.angle_c);a=a.getValue(c.radius_c);return{type:"constant",
    80 numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(b))*a,10)};case "sin":return b=a.getValue(c.angle_s),a=a.getValue(c.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(b))*a,10)};case "tan":return b=a.getValue(c.angle_t),a=a.getValue(c.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(b))*a,10)};case "valueOf":return a=parseInt(a.getValue(c.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",
    81 numeric:!0,content:a.getValue(c.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(c.value).substr(0,a.getValue(c.count))};case "right":return b=a.getValue(c.value),{type:"constant",numeric:!1,content:b.substr(b.length-a.getValue(c.count))};case "from":b=a.getValue(c.from);var d=c.to?a.getValue(c.to):null;a=a.getValue(c.value);return{type:"constant",numeric:!1,content:d?a.substr(b,d):a.substr(b)};case "position":return b=a.getValue(c.needle),a=a.getValue(c.haystack),{type:"constant",
    82 numeric:!0,content:c.last?a.lastIndexOf(b):a.indexOf(b)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(c.callback).payload};case "modulo":return b=a.getSymbolRecord(c.name),a=a.evaluate(c.value),{type:"constant",numeric:!0,content:b.value[b.index].content%a.content};case "format":b=a.getSymbolRecord(c.name);b=1E3*a.getValue(b.value[b.index]);try{switch(d=JSON.parse(a.getValue(c.value)),d.mode){case "time":return{type:"constant",numeric:!0,content:(new Date(b)).toLocaleTimeString(d.locale,
    83 d.options)};default:return{type:"constant",numeric:!0,content:(new Date(b)).toLocaleDateString(d.locale,d.options)}}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c.value);break}case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Math.floor(Date.now()/1E3)};case "today":return a=new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0,content:Math.floor(a.getTime()/1E3)};case "newline":return{type:"constant",numeric:!1,content:"\n"};
    84 case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(c.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(c.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(c.value).toLowerCase()};case "hash":a=a.getValue(c.value);c=0;if(0===a.length)return c;for(b=0;b<a.length;b++)d=a.charCodeAt(b),c=(c<<5)-c+d;return{type:"constant",numeric:!0,content:c};case "element":b=
    85 a.getValue(c.element);c=a.getSymbolRecord(c.symbol);d="";try{d=JSON.parse(a.getValue(c.value[c.index]))[b]}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":d=a.getValue(c.property);c=a.getSymbolRecord(c.symbol);a=a.getValue(c.value[c.index]);b="";if(d&&a)if("object"===typeof a)b=a[d];else if("{"===a.charAt(0))try{b=JSON.parse(a)[d]}catch(p){console.log("Can't parse '"+a+"': "+p.message)}return{type:"constant",
    86 numeric:!isNaN(b),content:"object"===typeof b?JSON.stringify(b):b};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(c.name).program};case "message":return b=a.message,{type:"constant",numeric:!1,content:b};case "error":return b=a.errorMessage,{type:"constant",numeric:!1,content:b};case "indexOf":d=a.getValue(c.value1);c=a.getValue(c.value2);try{return b=JSON.parse(c).indexOf(d),{type:"constant",numeric:!0,content:b}}catch(p){a.runtimeError(a[a.pc].lino,"Can't parse "+c)}break;
    87 case "arg":return b=a.getValue(c.value),b=a.getSymbolRecord(c.target)[b],{type:"constant",numeric:!isNaN(b),content:b}}return null},put:function(a,c){a.value[a.index]=c}},condition:{compile:function(a){if(a.isSymbol()){var c=a.getSymbolRecord();if("module"===c.keyword){if(a.nextTokenIs("is")){var d=!0;a.nextTokenIs("not")&&(a.next(),d=!1);if(a.tokenIs("running"))return a.next(),{domain:"core",type:"moduleRunning",name:c.name,sense:d}}return null}}if(a.tokenIs("not"))return{domain:"core",type:"not",
    88 value:a.getNextValue()};try{if(d=a.getValue(),"is"===a.getToken()){a.next();var f=b.isNegate(a);switch(a.getToken()){case "numeric":return a.next(),{domain:"core",type:"numeric",value1:d};case "even":return a.next(),{domain:"core",type:"even",value1:d};case "odd":return a.next(),{domain:"core",type:"odd",value1:d};case "greater":a.next();if(a.tokenIs("than")){a.next();var g=a.getValue();return{domain:"core",type:"greater",value1:d,value2:g,negate:f}}break;case "less":a.next();if(a.tokenIs("than")){a.next();
    89 var h=a.getValue();return{domain:"core",type:"less",value1:d,value2:h,negate:f}}break;default:var l=a.getValue();return{domain:"core",type:"is",value1:d,value2:l,negate:f}}}else if(d)return{domain:"core",type:"boolean",value:d}}catch(n){return a.warning("Can't get a value"),0}return null},test:function(a,c){switch(c.type){case "boolean":return a.getValue(c.value);case "numeric":return!isNaN(a.getValue(c.value1));case "even":return 0===a.getValue(c.value1)%2;case "odd":return 1===a.getValue(c.value1)%
    90 2;case "is":return a=a.compare(a,c.value1,c.value2),c.negate?0!==a:0===a;case "greater":return a=a.compare(a,c.value1,c.value2),c.negate?0>=a:0<a;case "less":return a=a.compare(a,c.value1,c.value2),c.negate?0<=a:0>a;case "not":return!a.getValue(c.value);case "moduleRunning":return a=a.getSymbolRecord(c.name).program,c.sense?a:!a}return!1}}};h.exports=b},{}],6:[function(d,h,g){var f=this,b=d("./Tokenise"),a=d("./Compile"),c=d("./Run"),e=d("./Value"),m=d("./Condition"),p=d("./Compare"),k={domain:{core:d("./Core")},
    91 runtimeError:function(a,c){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+c},k.program);k.program.aborted=!0},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,c){this.runtimeError(a,"Variable '"+c+"' does not hold a value")},reportError:function(c,b,d){if(c.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?e[a.getIndex()].lino:b[b.pc].lino;b=this.compiling?"Compile error":
    92 "Runtime error in '"+b.script+"'";b+=":\n";var f=e-5;for(f=0>f?0:f;f<e;f++){var l=(""+(f+1)).padStart(4," ");b+=l+" "+d[f].line.split("\\s").join(" ")+"\n"}b+=c.message+"\n";c=a.getWarnings();if(c.length)for(b+="Warnings:\n",c=$jscomp.makeIterator(c),d=c.next();!d.done;d=c.next())b+=d.value+"\n";console.log(b);alert(b)}else c="Error: "+c.message,alert(c),console.log(c);else console.log("An error occurred - origin was "+c.path[0])},getSymbolRecord:function(a){a=this[this.symbols[a].pc];return a.alias?
    93 this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return e.encode(a,this.encoding)},decode:function(a){return e.decode(a,this.encoding)},evaluate:function(a){return e.evaluate(this,a)},getValue:function(a){return e.getValue(this,a)},getFormattedValue:function(a){a=e.evaluate(this,a);if(a.numeric)return a.content;if('{"'===a.content.substr(0,2)||"["===a.content[0])try{var c=
    94 JSON.parse(a.content);return JSON.stringify(c,null,2)}catch(q){return this.reportError(q),"{}"}return a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(a){a&&(k.program=this,c.run(this,a))},exit:function(){c.exit(this)},register:function(a){k.program=a},require:function(a,c,b){var d=document.createElement("css"===a?"link":"script");switch(a){case "css":d.type="text/css";d.href=c;d.rel="stylesheet";
    95 break;case "js":d.type="text/javascript";d.src=c;break;default:return}d.onload=function(){console.log(Date.now()-k.timestamp+" ms: Library "+c+" loaded");b()};document.head.appendChild(d)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var c=a[a.pc],b=a.getValue(c.script),d=c.imports,e=c.module?a.getSymbolRecord(c.module):null;try{k.tokeniseScript(b.split("\n"),d,e,this,c.then)}catch(w){this.reportError(w,k.program,a.source);a.onError?a.run(a.onError):a.parent&&a.parent.onError&&
    96 a.parent.run(a.parent.onError);return}c.nowait&&this.run(a.nextPc)},close:function(){},compileScript:function(c,b,d,f){var g=c.tokens;this.compiling=!0;var l=Date.now();a.value=e;a.condition=m;a.domain=k.domain;a.imports=b;b=a.compile(g);var h=Date.now();console.log(h-k.timestamp+" ms: Compiled "+g.length+" tokens in "+(h-l+" ms"));this.compiling=!1;b.EasyCoder=k;b.value=e;b.condition=m;b.compare=p;b.source=c;b.run=this.run;b.exit=this.exit;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=
    97 this.getValue;b.getFormattedValue=this.getFormattedValue;b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.require=this.require;b.isUndefined=this.isUndefined;b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError=this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=
    98 this.variableDoesNotHoldAValueError;b.reportError=this.reportError;b.register=this.register;b.symbols=a.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0];b.module=d;b.parent=f;d&&(d.program=b);return b},tokeniseScript:function(a,d,e,f,g){var h=null,l=Date.now();a=b.tokenise(a);var m=Date.now();console.log(m-k.timestamp+" ms: Tokenised "+a.scriptLines.length+" lines in "+(m-l+" ms"));try{h=k.compileScript(a,d,e,f)}catch(u){"stop"!==u.message&&(d=k.program,this.reportError(u,d,a),d.onError&&
    99 d.run(d.onError))}h&&(h.onExit=g,c.run(h,0))},tokenize:function(a){var b=a.split("\n");if(!f.tokenising){try{k.tokeniseScript(b)}catch(q){k.reportError(q,null,a)}f.tokenising=!0}},setPluginCount:function(a){f.plugins=[];f.pluginCount=a},checkPlugin:function(a){return k.domain[a]},getPlugin:function(a,b,c){k.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+k.version,a.onload=function(){console.log(Date.now()-k.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},
    100 addGlobalPlugin:function(a,b){f.plugins.push({name:a,handler:b});f.plugins.length===f.pluginCount&&(f.plugins.forEach(function(a){k.domain[a.name]=a.handler}),k.tokenize(f.source))},addLocalPlugin:function(a,b,c){k.domain[a]=b;c()},getPluginsPath:function(){return k.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-k.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+k.version;b.type="text/javascript";
    101 b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(k.timestamp,a,k.setPluginCount,k.getPlugin,k.addGlobalPlugin)};b.onerror=function(){a?k.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):k.reportError({message:"Can't load plugins.js"},k.program,f.source)};document.head.appendChild(b);k.pluginsPath=a},start:function(a){f.source=a;a=window.location.pathname;a=a.endsWith("/")?a.slice(0,-1):"";k.loadPluginJs(a)}};h.exports=k},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,
    102 "./Value":9}],7:[function(d,h,g){var f={run:function(b,a){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(a);else for(b.register(b),c.push(a);0<c.length;)for(b.pc=c.shift(),b.watchdog=0,a={};;){if(1E6<b.watchdog){b.lino=b[b.pc].lino;b.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",b),b);break}b.watchdog++;var g=b[b.pc].domain;b.debugStep&&console.log(b.script+
    103 ": Line "+b[b.pc].lino+": PC: "+b.pc+" "+g+":"+b[b.pc].keyword);var h=b.domain[g];if(!h){b.runtimeError(b[b.pc].lino,"Unknown domain '"+g+"'");break}b.pc=h.run(b);if(!b.pc)break;if(b.stop){b.tracing=!1;break}if(b.tracing){g=b[b.pc];h=b.source.scriptLines;var k=d(h),l=document.getElementById("easycoder-tracer");if(!l){b.runtimeError(g.lino,"Element 'easycoder-tracer' was not found");return}l.style.display="block";l.style.visibility="visible";var n="";if(b.tracer){if(l=document.getElementById("easycoder-tracer-content")){b.tracer.variables.forEach(function(a,
    104 c,d){var e=b.getSymbolRecord(a);if(1<e.elements)for(n+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var f=e.value[a];n=f?n+(f.content+" "):n+"undefined "}else n=(e=e.value[e.index])?n+(a+": "+e.content):n+(a+": undefined");switch(b.tracer.alignment){case "horizontal":c<d.length-1&&(n+=", ");break;case "vertical":n+="<br>"}});n+="<hr>";for(var q="",r=5;0<r;r--){if(g.lino){var v=h[g.lino-r].line.substr(k);q+='<input type="text" name="'+r+'"'+('value="'+(g.lino-r+1)+": "+v.split("\\s").join(" ")+
    105 '"')+'style="width:100%;border:none;enabled:false">'}q+="<br>"}l.innerHTML=n+" "+q;l.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();b.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{f.run(b,b.resume)}catch(t){var c="Error in run handler: "+t.message;console.log(c);alert(c)}}}(a);a.step.onclick=function(a){return function(){console.log("step");
    106 a.step.blur();b.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{b.run(b.resume)}catch(t){var c="Error in step handler: "+t.message;console.log(c);alert(c)}}}(a)}b.resume=b.pc;b.pc=0}break}a={run:a.run,step:a.step}}},exit:function(b){b.onExit&&(b.parent.run(b.onExit),b.module.program=null)}};h.exports=f},{}],8:[function(d,h,g){var f={markComments:function(b){var a=b.list,c=void 0===b.index?0:b.index,d=void 0===b.inComment?!1:b.inComment,g=void 0===b.newList?
    107 []:b.newList;if(c>=a.length)return g;var h=a[c];b=h.lino;h=h.token;var k={list:a,index:c+1,inComment:!1,newList:g.concat({lino:b,index:c,token:h})};g={list:a,index:c+1,inComment:!0,newList:g.concat({lino:b,index:c,comment:!0,token:h})};return d&&0<c&&b===a[c-1].lino?f.markComments(g):"!"===h.charAt(0)?f.markComments(g):f.markComments(k)},findStrings:function(b){var a=b.original,c=b.line,d=void 0===b.inComment?!1:b.inComment;b=void 0===b.inQuote?!1:b.inQuote;var g=c.charAt(0),h=b&&[" ","\\t"].includes(g)?
    108 "\\s":g;if(1===c.length)return h;c=c.substring(1);if("!"===g&&!b)return g+f.findStrings({original:a,line:c,inComment:!0,inQuote:!1});if("`"===g&&!d&&!b)return g+f.findStrings({original:a,line:c,inComment:d,inQuote:!0});if("`"===g&&b)return g+f.findStrings({original:a,line:c,inComment:d,inQuote:!1});if(!d&&!b&&!g.match(/[A-z0-9_\-+*/\- \t]/)){if(["'",'"'].includes(g))throw Error('Bad syntax in "'+a+'":\nStrings in EasyCoder must be enclosed in backticks.');throw Error('Unrecognised character "'+g+
    109 '" in\n"'+a+'".');}return h+f.findStrings({original:a,line:c,inComment:d,inQuote:b})},tokenise:function(b){b=b.map(function(a){var b=a.trim();return b.length?f.findStrings({original:a,line:b}):""}).map(function(a,b){return{lino:b+1,line:a}});var a=b.map(function(a){return a.line.trim().split(/\s+/).map(function(b,c){return{lino:a.lino,index:c,token:b}})});a=[].concat.apply([],a).filter(function(a){return a.token}).map(function(a){return{lino:a.lino,index:a.index,token:a.token.split("\\s").join(" ")}});
    110 a=f.markComments({list:a}).filter(function(a){return!a.comment});return{scriptLines:b,tokens:a}}};h.exports=f},{}],9:[function(d,h,g){var f={getItem:function(b){var a=b.getToken();if(!a)return null;if("true"===a)return b.next(),{type:"boolean",content:!0};if("false"===a)return b.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return b.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var c=eval(a);if(Number.isInteger(c))return b.next(),{type:"constant",
    111 numeric:!0,content:c};throw Error("'"+a+"' is not an integer");}a=b.getIndex();c=$jscomp.makeIterator(Object.keys(b.domain));for(var d=c.next();!d.done;d=c.next())if(d=d.value,b.rewindTo(a),d=b.domain[d].value.compile(b))return d;return null},compile:function(b){var a=b.getToken(),c=f.getItem(b);if(!c)throw Error("Undefined value: '"+a+"'");if("cat"===b.getToken()){for(a={type:"cat",numeric:!1,parts:[c]};b.tokenIs("cat");)b.next(),a.parts.push(b.value.getItem(b));return a}return c},doValue:function(b,
    112 a){if("undefined"===typeof a.type)return b.runtimeError(b[b.pc].lino,"Undefined value (variable not initialized?)"),null;switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,c){return a+f.doValue(b,c).content},"")};case "boolean":case "constant":return a;case "symbol":var c=b.getSymbolRecord(a.name);if(c.isValueHolder){if(a=c.value[c.index]){c=a.content;if(null===c||"undefined"===typeof c)a.content=a.numeric?0:"";return a}return null}return b.domain[c.domain].value.get(b,
    113 a)}return b.domain[a.domain].value.get(b,a)},constant:function(b,a){return{type:"constant",numeric:a,content:b}},evaluate:function(b,a){if(!a)return{type:"constant",numeric:!1,content:""};var c=f.doValue(b,a);if(c)return c;b.runtimeError(b[b.pc].lino,"Can't decode value: "+a)},getValue:function(b,a){return f.evaluate(b,a).content},encode:function(b,a){if(b)switch(a){case "ec":return b.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(b.replace(/\s/g,
    114 "+"));case "sanitize":return b.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return b},decode:function(b,a){if(b)switch(a){case "ec":return b.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(b).replace(/\+/g," ")}return b}};h.exports=f},{}]},{},[1]);
     13(function(){function d(k,h,f){function c(b,q){if(!h[b]){if(!k[b]){var e="function"==typeof require&&require;if(!q&&e)return e(b,!0);if(a)return a(b,!0);q=Error("Cannot find module '"+b+"'");throw q.code="MODULE_NOT_FOUND",q;}q=h[b]={exports:{}};k[b][0].call(q.exports,function(a){return c(k[b][1][a]||a)},q,q.exports,d,k,h,f)}return h[b].exports}for(var a="function"==typeof require&&require,b=0;b<f.length;b++)c(f[b]);return c}return d})()({1:[function(d,k,h){var f=d("./easycoder/Main");f.version="2.4.2";
     14f.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");window.onload=function(){console.log(Date.now()-f.timestamp+" ms: Page loaded; reset timer & start EasyCoder");f.timestamp=Date.now();f.scripts={};window.EasyCoder=f;var c=document.getElementById("easycoder-script");if(c){c.style.display="none";try{f.start(c.innerText)}catch(a){f.reportError(a)}}}},{"./easycoder/Main":6}],2:[function(d,k,h){k.exports=function(d,c,a){c=d.value.evaluate(d,c);d=d.value.evaluate(d,a);a=c.content;
     15var b=d.content;a&&c.numeric?d.numeric||(b="undefined"===typeof b?0:parseInt(b)):(b&&d.numeric&&(b=b.toString()),"undefined"===typeof a&&(a=""),"undefined"===typeof b&&(b=""));return a>b?1:a<b?-1:0}},{}],3:[function(d,k,h){var f=Object.assign||function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b],d;for(d in c)Object.prototype.hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a},c=this,a={getTokens:function(){return c.tokens},addWarning:function(a){c.warnings.push(a)},warning:function(b){a.addWarning(b)},
     16unrecognisedSymbol:function(b){a.addWarning("Unrecognised symbol '"+b+"'")},getWarnings:function(){return c.warnings},getIndex:function(){return c.index},next:function(a){c.index+=void 0===a?1:a},peek:function(){return c.tokens[c.index+1].token},more:function(){return c.index<c.tokens.length},getToken:function(){return c.index>=c.tokens.length?null:c.tokens[c.index]?c.tokens[c.index].token:null},nextToken:function(){a.next();return a.getToken()},tokenIs:function(a){return c.index>=c.tokens.length?
     17!1:a===c.tokens[c.index].token},nextTokenIs:function(b){a.next();return a.tokenIs(b)},skip:function(b){if(c.index>=c.tokens.length)return null;a.next();a.tokenIs(b)&&a.next()},prev:function(){c.index--},getLino:function(){return c.index>=c.tokens.length?0:c.tokens[c.index].lino},getTarget:function(a){a=void 0===a?c.index:a;return c.tokens[a].token},getTargetPc:function(b){b=void 0===b?c.index:b;return c.symbols[a.getTarget(b)].pc},getCommandAt:function(a){return c.program[a]},isSymbol:function(b){b=
     18void 0===b?!1:b;if(a.getTarget()in c.symbols)return!0;if(b)throw Error("Unknown symbol: '"+a.getTarget()+"'");return!1},nextIsSymbol:function(b){b=void 0===b?!1:b;a.next();return a.isSymbol(b)},getSymbol:function(){return c.symbols[a.getToken()]},getSymbolPc:function(){return a.getSymbol().pc},getSymbolRecord:function(){var b=c.program[a.getSymbolPc()];b.used=!0;return b},getSymbols:function(){return c.symbols},getProgram:function(){return c.program},getPc:function(){return c.program.length},getValue:function(){return a.value.compile(a)},
     19getNextValue:function(){a.next();return a.getValue()},getCondition:function(){return a.condition.compile(a)},constant:function(b,e){return a.value.constant(b,void 0===e?!1:e)},addCommand:function(a){c.program.push(f({pc:c.program.length},a))},addSymbol:function(a,e){c.symbols[a]={pc:e}},mark:function(){c.savedMark=c.index},rewind:function(){c.index=c.savedMark},rewindTo:function(a){c.index=a},completeHandler:function(){var b=a.getLino(),e=a.getPc();a.addCommand({domain:"core",keyword:"goto",lino:b,
     20goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"stop",lino:b,next:0});a.getCommandAt(e).goto=a.getPc();return!0},compileVariable:function(b,e,q,d){q=void 0===q?!1:q;d=void 0===d?null:d;a.next();var l=a.getLino(),g=a.getTokens()[a.getIndex()];if(c.symbols[g.token])throw Error("Duplicate variable name '"+g.token+"'");var f=a.getPc();a.next();a.addSymbol(g.token,f);b={domain:b,keyword:e,lino:l,isSymbol:!0,used:!1,isValueHolder:q,name:g.token,elements:1,index:0,value:[{}],element:[],extra:d};
     21"dom"===d&&(b.element=[]);a.addCommand(b);return b},compileToken:function(){var b=a.getToken();if(b){a.mark();for(var e=$jscomp.makeIterator(Object.keys(a.domain)),c=e.next();!c.done;c=e.next()){if((c=a.domain[c.value])&&(c=c.getHandler(b))&&c.compile(a))return;a.rewind()}console.log("No handler found");throw Error("I don't understand '"+b+"...'");}},compileOne:function(){var b=a.getToken();if(b){c.warnings=[];var e=c.program.length;if(b.endsWith(":")){b=b.substring(0,b.length-1);if(c.symbols[b])throw Error("Duplicate symbol: '"+
     22b+"'");c.symbols[b]={pc:e};c.index++}else a.compileToken()}},compileFromHere:function(b){for(;c.index<c.tokens.length;){var e=c.tokens[c.index].token;if("else"===e)return c.program;a.compileOne();if(-1<b.indexOf(e))break}},compile:function(b){c.tokens=b;c.index=0;c.program=[];c.symbols={};c.warnings=[];a.compileFromHere([]);a.addCommand({domain:"core",keyword:"exit",lino:a.getLino(),next:0});for(var e in c.symbols)b=c.program[c.symbols[e].pc],b.isSymbol&&!b.used&&console.log("Symbol '"+b.name+"' has not been used.");
     23return c.program}};k.exports=a},{}],4:[function(d,k,h){var f=Object.assign||function(c){for(var a=1;a<arguments.length;a++){var b=arguments[a],e;for(e in b)Object.prototype.hasOwnProperty.call(b,e)&&(c[e]=b[e])}return c};k.exports={compile:function(c){c.mark();for(var a=$jscomp.makeIterator(Object.keys(c.domain)),b=a.next();!b.done;b=a.next()){if(b=c.domain[b.value].condition.compile(c))return f({domain:name},b);c.rewind()}},test:function(c,a){return c.domain[a.domain].condition.test(c,a)}}},{}],
     245:[function(d,k,h){var f=this,c={Add:{compile:function(a){var b=a.getLino();a.next();var e=a.getValue();if(a.tokenIs("to"))if(a.next(),a.isSymbol()){var c=a.getSymbol();if(a.getCommandAt(c.pc).isValueHolder){if("giving"===a.peek()){c=a.getValue();a.next();var d=a.getToken();a.next();a.addCommand({domain:"core",keyword:"add",lino:b,value1:e,value2:c,target:d})}else c=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:b,value1:e,target:c});return!0}a.warning("core "+f.name+": Expected value holder")}else{c=
     25a.getValue();if(a.tokenIs("giving"))return a.next(),d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"add",lino:b,value1:e,value2:c,target:d}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1},run:function(a){var b=a[a.pc],e=b.value1,c=b.value2,d=a.getSymbolRecord(b.target);if(d.isValueHolder){var l=d.value[d.index];c?(a=a.getValue(c)+a.getValue(e),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!l.numeric&&isNaN(l.content)&&a.nonNumericValueError(b.lino),a=parseInt(l.content)+
     26parseInt(a.getValue(e)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(b.lino,d.name);return b.pc+1}},Alias:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();if(a.tokenIs("to")&&(a.next(),a.isSymbol())){var c=a.getSymbolRecord();c.used=!0;a.next();a.addCommand({domain:"core",keyword:"alias",lino:b,alias:e,symbol:c.name});return!0}}return!1},run:function(a){var b=a[a.pc],e=a.symbols[b.alias].pc,c=a[e],d=a.getSymbolRecord(b.symbol);
     27a[e]={pc:c.pc,domain:d.domain,keyword:d.keyword,lino:c.lino,name:c.name,alias:b.symbol};return b.pc+1}},Append:{compile:function(a){var b=a.getLino(),e=a.getNextValue();if(a.tokenIs("to")&&a.nextIsSymbol()){var c=a.getSymbolRecord();if(c.isValueHolder)return a.next(),a.addCommand({domain:"core",keyword:"append",lino:b,value:e,select:c.name}),!0}return!1},run:function(a){var b=a[a.pc],e=a.getSymbolRecord(b.select);try{var c=a.getValue(b.value),d=["{","["].includes(c[0])?JSON.parse(c):c,l=e.value[e.index],
     28n=l.content;n=n?JSON.parse(n):[];n.push(d);l.content=JSON.stringify(n);return b.pc+1}catch(p){return a.runtimeError(b.lino,"JSON: Unable to parse value"),!1}}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core","callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbolRecord();if(e.isValueHolder)return e=
     29a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"clear",lino:b,symbol:e}),!0;a.warning("'Variable '"+e.name+"' does not hold a value")}return!1},run:function(a){var b=a[a.pc],e=a.getSymbolRecord(b.symbol);e.isValueHolder?(a.domain[e.domain].value.put(e,{type:"boolean",content:!1}),b.numeric=!1):a.variableDoesNotHoldAValueError(b.lino,e.name);return b.pc+1}},Close:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if("module"===e.keyword)return a.next(),
     30a.addCommand({domain:"core",keyword:"close",lino:b,module:e.name}),!0}return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.module).program;a.run(a.onClose);return b.pc+1}},Debug:{compile:function(a){var b=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"debug",lino:b,item:e});return!0}a.addCommand({domain:"core",keyword:"debug",lino:b,item:"program"});return!0}return a.tokenIs("symbols")?
     31(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"symbols"}),!0):a.tokenIs("symbol")?(e=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"symbol",name:e}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"step"}),!0):!1},run:function(a){var b=a[a.pc],e=b.item;switch(e){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(b.name);e=a.exporter;delete a.exporter;
     32console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter=e;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=e.content&&console.log("Debug item "+e.content+": "+JSON.stringify(a[e.content],null,2))}return b.pc+1}},Decode:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:b,symbol:e});return!0}return!1},run:function(a){var b=a[a.pc],
     33e=a.getSymbolRecord(b.symbol);if(e.isValueHolder){var c=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.decode(c)};b.numeric=!1}else a.variableDoesNotHoldAValueError(b.lino,e.name);return b.pc+1}},Divide:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbol();var c=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return c=a.getSymbol(),c=a.getCommandAt(c.pc).name,
     34a.next(),a.addCommand({domain:"core",keyword:"divide",lino:b,value1:e,value2:d,target:c}),!0;a.warning("core "+f.name+": Expected value holder")}else return"undefined"===typeof c&&a.warning("core "+f.name+": No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:b,value2:d,target:c}),!0;return!1},run:function(a){var b=a[a.pc],e=b.value1,c=b.value2,d=a.getSymbolRecord(b.target);if(d.isValueHolder){var l=d.value[d.index];e?(a=a.getValue(e)/a.getValue(c),d.value[d.index]={type:"constant",
     35numeric:!0,content:Math.trunc(a)}):(!l.numeric&&isNaN(l.content)&&a.nonNumericValueError(b,lino),a=parseInt(l.content)/parseInt(a.getValue(c)),d.value[d.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(b.lino,d.name);return b.pc+1}},Dummy:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"core",keyword:"dummy",lino:b});return!0},run:function(a){return a[a.pc].pc+1}},Encode:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var e=
     36a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:b,symbol:e});return!0}return!1},run:function(a){var b=a[a.pc],e=a.getSymbolRecord(b.symbol);if(e.isValueHolder){var c=a.getValue(e.value[e.index]);e.value[e.index]={type:"constant",numeric:!1,content:a.encode(c)};b.numeric=!1}else a.variableDoesNotHoldAValueError(b.lino,e.name);return b.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"});
     37return!0},run:function(a){a.exit();return 0}},Filter:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var e=a.getSymbolRecord();if(a.nextTokenIs("with")){var c=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"filter",lino:b,array:e.name,func:c});return!0}}return!1},run:function(a){var b=a[a.pc],e=a.getSymbolRecord(b.array),c=e.value[e.index].content,d=a.getSymbolRecord(b.func).pc;try{var l=JSON.parse(c).filter(function(b){e.a=b;a.run(d);return e.v});e.value[e.index].content=
     38JSON.stringify(l)}catch(n){a.runtimeError(b.lino,"Can't parse this array")}return b.pc+1}},Fork:{compile:function(a){var b=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:b,label:e});return!0},run:function(a){var b=a[a.pc];try{a.run(a.symbols[b.label].pc)}catch(e){console.log(e.message),alert(e.message)}return b.pc+1}},Go:{compile:function(a){var b=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",
     39keyword:"go",lino:b,label:e});return!0},run:function(a){var b=a[a.pc];if(b.label){if(a.verifySymbol(b.label)){var e=a.symbols[b.label];if(e)return e.pc}a.runtimeError(b.lino,"Unknown symbol '"+b.label+"'");return 0}return b.goto}},Gosub:{compile:function(a){var b=a.getLino();a.nextTokenIs("to")&&a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"gosub",lino:b,label:e});return!0},run:function(a){var b=a[a.pc];if(a.verifySymbol(b.label))return a.stack.push(a.pc+1),a.symbols[b.label].pc;
     40a.runtimeError(b.lino,"Unknown symbol '"+b.label+"'");return 0}},If:{compile:function(a){var b=a.getLino();a.next();var e=a.condition.compile(a),c=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:b,condition:e});a.compileOne();if(!a.getToken())return a.getCommandAt(c).else=a.getPc(),!0;a.tokenIs("else")?(b=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(c).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(b).goto=a.getPc()):a.getCommandAt(c).else=a.getPc();
     41return!0},run:function(a){var b=a[a.pc];return a.condition.test(a,b.condition)?b.pc+1:b.else}},Import:{compile:function(a){var b=a.imports,e=a.getProgram();if(b.length){b=$jscomp.makeIterator(b);for(var c=b.next();!c.done;c=b.next()){c=c.value;var d=a.nextToken(),l=c.keyword;if(d===l){if(d=a.compileVariable(c.domain,l,!0),d=e[a.getSymbols()[d.name].pc],d.element=c.element,d.exporter=c.exporter,d.exportedName=c.name,d.extra=c.extra,d.isValueHolder=c.isValueHolder,d.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+
     42c.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");}else a.next();return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol(!0)){var e=a.getToken();if(a.nextTokenIs("to")){var c=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:b,symbol:e,value:c});return!0}}return!1},run:function(a){var b=a[a.pc],e=a.getSymbolRecord(b.symbol),c=a.getValue(b.value);c>=e.elements&&a.runtimeError(b.lino,"Array index "+c+" is out of range for '"+
     43e.name+"'");e.index=c;e.imported&&(e.exporter.getSymbolRecord(e.exportedName).index=c);return b.pc+1}},Load:{compile:function(a){var b=a.getLino();switch(a.nextToken()){case "plugin":var e=a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:b,name:e});return!0}return!1},run:function(a){var b=a[a.pc],e=a.getValue(b.name);switch(b.keyword){case "load":if(a.checkPlugin(e))return b.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,e,a.getPlugin,a.addLocalPlugin,function(){a.run(b.pc+
     441)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){a=a[a.pc];a.program=null;return a.pc+1}},Multiply:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var e=a.getSymbol();var c=a.getCommandAt(e.pc).name}e=a.getValue();a.tokenIs("by")&&a.next();var d=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return c=a.getSymbol(),c=a.getCommandAt(c.pc).name,a.next(),a.addCommand({domain:"core",keyword:"multiply",lino:b,value1:e,
     45value2:d,target:c}),!0;a.warning("core multiply: Expected value holder")}else return"undefined"===typeof c&&a.warning("core multiply: No target variable given"),a.addCommand({domain:"core",keyword:"multiply",lino:b,value2:d,target:c}),!0;return!1},run:function(a){var b=a[a.pc],e=b.value1,c=b.value2,d=a.getSymbolRecord(b.target);if(d.isValueHolder){var l=d.value[d.index];e?(a=a.getValue(e)*a.getValue(c),d.value[d.index]={type:"constant",numeric:!0,content:a}):(!l.numeric&&isNaN(l.content)&&a.nonNumericValueError(b,
     46lino),a=parseInt(l.content)*parseInt(a.getValue(c)),d.value[d.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(b.lino,d.name);return b.pc+1}},Negate:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"negate",lino:b,symbol:e});return!0}return!1},run:function(a){var b=a[a.pc],e=a.getSymbolRecord(b.symbol);e.isValueHolder?e.value[e.index]={type:"constant",numeric:!0,content:-e.value[e.index].content}:
     47a.variableDoesNotHoldAValueError(b.lino,e.name);return b.pc+1}},On:{compile:function(a){var b=a.getLino(),e=a.nextToken();switch(e){case "close":case "restore":case "message":case "error":return a.next(),a.addCommand({domain:"core",keyword:"on",lino:b,action:e}),a.completeHandler()}return a.isSymbol()&&(e=a.getSymbolRecord(),"callback"===e.keyword)?(a.next(),a.addCommand({domain:"core",keyword:"on",lino:b,action:e.name}),a.completeHandler()):!1},run:function(a){var b=a[a.pc],e=b.pc+2;switch(b.action){case "close":a.onClose=
     48e;break;case "restore":a.onRestore=e;break;case "message":a.onMessage=e;break;case "error":a.onError=e;break;default:var c=a.getSymbolRecord(b.action);if(c)c.cb=e;else return a.runtimeError(b.lino,"Unknown action '"+b.action+"'"),0}return b.pc+1}},Print:{compile:function(a){var b=a.getLino();a.next();var e=a.getValue();a.addCommand({domain:"core",keyword:"print",lino:b,value:e});return!0},run:function(a){var b=a[a.pc];a=a.getFormattedValue(b.value);console.log("-> "+a);return b.pc+1}},Put:{compile:function(a){var b=
     49a.getLino(),e=a.getNextValue();if(a.tokenIs("into")){if(a.nextIsSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"put",lino:b,value:e,target:c});return!0}a.warning("core:put: No such variable: '"+a.getToken()+"'")}return!1},run:function(a){var b=a[a.pc],e=a.getSymbolRecord(b.target);e.isValueHolder||a.variableDoesNotHoldAValueError(b.lino,e.name);a=a.evaluate(b.value);e.value[e.index]={type:a.type,numeric:a.numeric,content:a.content};e.imported&&(e=e.exporter.getSymbolRecord(e.exportedName),
     50e.value[e.index]=a);return b.pc+1}},Replace:{compile:function(a){var b=a.getLino(),e=a.getNextValue();if(a.tokenIs("with")){var c=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var d=a.getSymbolRecord();a.next();if(d.isValueHolder)return a.addCommand({domain:"core",keyword:"replace",lino:b,original:e,replacement:c,target:d.name}),!0;throw Error("'"+d.name+"' does not hold a value");}}return!1},run:function(a){var b=a[a.pc],e=a.getValue(b.original),c=a.getValue(b.replacement),d=a.getSymbolRecord(b.target);
     51a=a.getValue(d.value[d.index]).split(e).join(c);d.value[d.index]={type:"constant",numeric:!1,content:a};return b.pc+1}},Require:{compile:function(a){var b=a.getLino(),e=a.nextToken();if(["css","js"].includes(e)){var c=a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:b,type:e,url:c});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var b=a[a.pc];a.require(b.type,a.getValue(b.url),function(){a.run(b.pc+1)});return 0}},Return:{compile:function(a){var b=a.getLino();
     52a.next();a.addCommand({domain:"core",keyword:"return",lino:b});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var b=a.getLino(),e=a.getNextValue(),c=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var d=a.getSymbolRecord();d.exporter=a.getProgram();c.push(d);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var l=a.getSymbolRecord();a.next();if("module"!==l.keyword)throw Error("'"+l.name+"' is not a module");l=l.name}var n=!1;a.tokenIs("nowait")&&
     53(a.next(),n=!0);d=a.getPc();a.addCommand({domain:"core",keyword:"run",lino:b,script:e,imports:c,module:l,nowait:n,then:0});a.tokenIs("then")&&(b=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).then=a.getPc(),a.next(),a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(b).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var e=a.getToken();
     54a.next();a.addCommand({domain:"core",keyword:"sanitize",lino:b,name:e});return!0}return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return b.pc+1}},Script:{compile:function(a){var b=a.getLino(),e=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"script",lino:b,name:e});return!0},run:function(a){var b=a[a.pc];a.script=b.name;EasyCoder.scripts[b.name]=a;console.log(Date.now()-EasyCoder.timestamp+" ms: Script: "+
     55b.name);return b.pc+1}},Send:{compile:function(a){var b=a.getLino(),e="";a.nextTokenIs("to")||(e=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var c="parent";else if(a.isSymbol){c=a.getSymbolRecord();if("module"!==c.keyword)throw Error("'"+c.name+"' is not a module");c=c.name}a.next();a.addCommand({domain:"core",keyword:"send",lino:b,message:e,recipient:c})}return!0},run:function(a){var b=a[a.pc],c=a.getValue(b.message);if("parent"===b.recipient){var d=a.parent;d&&a.parent.onMessage&&
     56(d.message=c,d.run(d.onMessage))}else a=a.getSymbolRecord(b.recipient),a.program&&(a.program.message=c,a.program.run(a.program.onMessage));return b.pc+1}},Set:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if(!c.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=[];;){a.mark();try{d.push(a.getValue())}catch(l){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:b,request:"setArray",target:c.name,value:d});return!0}a.addCommand({domain:"core",
     57keyword:"set",lino:b,request:"setBoolean",target:c.name});return!0}switch(a.getToken()){case "ready":return a.next(),a.addCommand({domain:"core",keyword:"set",lino:b,request:"setReady"}),!0;case "property":c=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to"))){var g=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:b,request:"setProperty",target:d.name,name:c,value:g});return!0}break;case "arg":if(c=a.getNextValue(),
     58a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),a.nextTokenIs("to")))return g=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",lino:b,request:"setArg",target:d.name,name:c,value:g}),!0}a.tokenIs("the")&&a.next();switch(a.getToken()){case "elements":a.next();if(a.tokenIs("of")){a.next();if(!a.isSymbol())throw Error("Unknown variable '"+a.getToken()+"'");c=a.getToken();a.next();if(a.tokenIs("to"))return a.next(),d=a.getValue(),a.addCommand({domain:"core",keyword:"set",lino:b,request:"setElements",
     59symbol:c,value:d}),!0}break;case "encoding":if(a.nextTokenIs("to"))return c=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"encoding",lino:b,encoding:c}),!0;a.addWarning("Unknown encoding option");break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),"callback"===c.keyword&&a.nextTokenIs("to")))return d=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",request:"setPayload",lino:b,callback:c.name,payload:d}),!0}return!1},run:function(a){var b=
     60a[a.pc];switch(b.request){case "setBoolean":var c=a.getSymbolRecord(b.target);c.isValueHolder?(c.value[c.index]={type:"boolean",content:!0},b.numeric=!1):a.variableDoesNotHoldAValueError(b.lino,c.name);break;case "setReady":a.parent.run(a.parent.nextPc);a.parent.nextPc=0;break;case "setElements":c=a.getSymbolRecord(b.symbol);var d=c.elements;c.elements=a.getValue(b.value);c.index=0;if(c.elements>d)for(a=d;a<c.elements;a++)c.value.push({}),c.element.push({});else c.value=c.value.slice(0,c.elements),
     61c.element=c.element.slice(0,c.elements);break;case "setArray":c=a.getSymbolRecord(b.target);c.elements=b.value.length;c.value=b.value;break;case "encoding":a.encoding=a.getValue(b.encoding);break;case "setProperty":c=a.getSymbolRecord(b.target);var g=a.getValue(c.value[c.index]);g||(g="{}");d="";try{d=JSON.parse(g)}catch(l){return a.runtimeError(b.lino,"Can't parse "+c.name),0}g=a.getValue(b.name);if(a=a.evaluate(b.value))a.content instanceof Array?d[g]=a.content:"boolean"===a.type?d[g]=a.content:
     62a.numeric?d[g]=a.content:'{"'===a.content.substr(0,2)?d[g]=JSON.parse(a.content):d[g]=a.content.split('"').join('\\"'),c.value[c.index]={type:"constant",numeric:!1,content:JSON.stringify(d)};break;case "setPayload":a.getSymbolRecord(b.callback).payload=a.getValue(b.payload);break;case "setArg":d=a.getValue(b.name),c=a.getSymbolRecord(b.target),c[d]=a.getValue(b.value)}return b.pc+1}},Sort:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if(a.nextTokenIs("with")){var d=
     63a.nextToken();a.next();a.addCommand({domain:"core",keyword:"sort",lino:b,array:c.name,func:d});return!0}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.array),d=c.value[c.index].content,g=a.getSymbolRecord(b.func).pc;try{var l=JSON.parse(d);l.sort(function(b,e){c.a=b;c.b=e;a.run(g);return c.v});c.value[c.index].content=JSON.stringify(l)}catch(n){a.runtimeError(b.lino,"Can't parse this array")}return b.pc+1}},Stop:{compile:function(a){var b=a.getLino();a.next();if(a.more()&&a.isSymbol()){var c=
     64a.getSymbolRecord();return"module"===c.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:b,name:c.name}),!0):!1}a.addCommand({domain:"core",keyword:"stop",lino:b,next:0});return!0},run:function(a){var b=a[a.pc];if(b.name)a.getSymbolRecord(b.name).program.exit();else return 0;return b.pc+1}},Take:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=
     65a.getValue();a.next();var g=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,value2:d,target:g})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,target:d});return!0}a.warning("core "+f.name+": Expected value holder")}else{d=a.getValue();if(a.tokenIs("giving"))return a.next(),g=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,value2:d,target:g}),!0;a.warning("core "+f.name+': Expected "giving"')}return!1},
     66run:function(a){var b=a[a.pc],c=b.value1,d=b.value2,g=a.getSymbolRecord(b.target);if(g.isValueHolder){var l=g.value[g.index];d?(a=a.getValue(d)-a.getValue(c),g.value[g.index]={type:"constant",numeric:!0,content:a}):(!l.numeric&&isNaN(l.content)&&a.nonNumericValueError(b.lino),a=parseInt(a.getValue(l))-parseInt(a.getValue(c)),g.value[g.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(b.lino,g.name);return b.pc+1}},Toggle:{compile:function(a){var b=a.getLino();a.next();
     67if(a.isSymbol()){var c=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:b,symbol:c});return!0}return!1},run:function(a){var b=a[a.pc],c=a[b.symbol];if(c.isValueHolder){var d=a.domain[c.domain];a=d.value.get(a,c.value[c.index]).content;d.value.put(c,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(b.lino,c.name);return b.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var b=
     68a.getLino();a.next();var c=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:b,value:c,multiplier:d});return!0},run:function(a){var b=a[a.pc],c=a.getValue(b.value);setTimeout(function(){a.run(b.pc+1)},c*b.multiplier);return 0}},While:{compile:function(a){var b=a.getLino();a.next();
     69var c=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:b,condition:c});b=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(b).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return c.Add;case "alias":return c.Alias;case "append":return c.Append;case "begin":return c.Begin;case "callback":return c.Callback;
     70case "clear":return c.Clear;case "close":return c.Close;case "debug":return c.Debug;case "decode":return c.Decode;case "divide":return c.Divide;case "dummy":return c.Dummy;case "encode":return c.Encode;case "end":return c.End;case "exit":return c.Exit;case "filter":return c.Filter;case "fork":return c.Fork;case "go":case "goto":return c.Go;case "gosub":return c.Gosub;case "if":return c.If;case "import":return c.Import;case "index":return c.Index;case "load":return c.Load;case "module":return c.Module;
     71case "multiply":return c.Multiply;case "negate":return c.Negate;case "on":return c.On;case "print":return c.Print;case "put":return c.Put;case "replace":return c.Replace;case "require":return c.Require;case "return":return c.Return;case "run":return c.Run;case "sanitize":return c.Sanitize;case "script":return c.Script;case "send":return c.Send;case "set":return c.Set;case "sort":return c.Sort;case "stop":return c.Stop;case "take":return c.Take;case "toggle":return c.Toggle;case "variable":return c.Variable;
     72case "wait":return c.Wait;case "while":return c.While;default:return!1}},run:function(a){var b=a[a.pc],d=c.getHandler(b.keyword);d||a.runtimeError(b.lino,"Unknown keyword '"+b.keyword+"' in 'core' package");return d.run(a)},isNegate:function(a){return"not"===a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var b=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",name:b};case "variable":var c=a.nextToken();return["format",
     73"modulo"].includes(c)?(a=a.getNextValue(),{domain:"core",type:c,name:b,value:a}):{domain:"core",type:"symbol",name:b}}return null}b=a.getToken();if("true"===b)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===b)return a.next(),{domain:"core",type:"boolean",content:!1};if("random"===b)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"cos",angle_c:b,radius_c:a};if("sin"===
     74b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:b,radius_s:a};if("tan"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:b,radius_t:a};if(["now","today","newline","break","empty"].includes(b))return a.next(),{domain:"core",type:b};if("date"===b)return{domain:"core",type:"date",value:a.getNextValue()};if(["encode","decode","lowercase","hash"].includes(b))return a.next(),a=a.getValue(),{domain:"core",
     75type:b,value:a};if("element"===b)return b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),a.next(),"variable"===c.keyword)?{domain:"core",type:"element",element:b,symbol:c.name}:null;if("property"===b)return b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),a.next(),"variable"===c.keyword)?{domain:"core",type:"property",property:b,symbol:c.name}:null;if("arg"===b&&(b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()))return c=a.getSymbolRecord(),
     76a.next(),{domain:"core",type:"arg",value:b,target:c.name};a.tokenIs("the")&&a.next();b=a.getToken();switch(b){case "elements":if(a.nextTokenIs("of")&&a.nextIsSymbol())return c=a.getToken(),a.next(),{domain:"core",type:b,name:c};break;case "index":if(a.nextTokenIs("of")){if(a.nextIsSymbol()){if("in"===a.peek())return b=a.getValue(),a=a.getNextValue(),{domain:"core",type:"indexOf",value1:b,value2:a};c=a.getToken();a.next();return{domain:"core",type:b,name:c}}b=a.getValue();if(a.tokenIs("in"))return a=
     77a.getNextValue(),{domain:"core",type:"indexOf",value1:b,value2:a}}break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf",value:a.getValue()};break;case "length":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"lengthOf",value:a.getValue()};break;case "left":case "right":c=a.getNextValue();if(a.tokenIs("of"))return a=a.getNextValue(),{domain:"core",type:b,count:c,value:a};break;case "from":c=a.getNextValue();var d=a.tokenIs("to")?a.getNextValue():null;if(a.tokenIs("of"))return a=
     78a.getNextValue(),{domain:"core",type:b,from:c,to:d,value:a};break;case "position":if(a.nextTokenIs("of")&&(b=!1,a.nextTokenIs("the")&&a.nextTokenIs("last")&&(a.next(),b=!0),c=a.getValue(),a.tokenIs("in")))return a=a.getNextValue(),{domain:"core",type:"position",needle:c,haystack:a,last:b};break;case "payload":if(a.nextTokenIs("of")&&a.nextIsSymbol()&&(b=a.getSymbolRecord(),"callback"===b.keyword))return a.next(),{domain:"core",type:"payload",callback:b.name};break;case "message":case "error":return a.next(),
     79{domain:"core",type:b}}return null},get:function(a,b){switch(b.type){case "boolean":return{type:"boolean",numeric:!1,content:b.content};case "elements":return{type:"constant",numeric:!0,content:a.getSymbolRecord(b.name).elements};case "index":return{type:"constant",numeric:!0,content:a.getSymbolRecord(b.name).index};case "random":return a=a.evaluate(b.range),{type:"constant",numeric:!0,content:Math.floor(Math.random()*a.content)};case "cos":var c=a.getValue(b.angle_c);a=a.getValue(b.radius_c);return{type:"constant",
     80numeric:!0,content:parseInt(Math.cos(.01745329*parseFloat(c))*a,10)};case "sin":return c=a.getValue(b.angle_s),a=a.getValue(b.radius_s),{type:"constant",numeric:!0,content:parseInt(Math.sin(.01745329*parseFloat(c))*a,10)};case "tan":return c=a.getValue(b.angle_t),a=a.getValue(b.radius_t),{type:"constant",numeric:!0,content:parseInt(Math.tan(.01745329*parseFloat(c))*a,10)};case "valueOf":return a=parseInt(a.getValue(b.value)),{type:"constant",numeric:!0,content:a?a:0};case "lengthOf":return{type:"constant",
     81numeric:!0,content:a.getValue(b.value).length};case "left":return{type:"constant",numeric:!1,content:a.getValue(b.value).substr(0,a.getValue(b.count))};case "right":return c=a.getValue(b.value),{type:"constant",numeric:!1,content:c.substr(c.length-a.getValue(b.count))};case "from":c=a.getValue(b.from);var d=b.to?a.getValue(b.to):null;a=a.getValue(b.value);return{type:"constant",numeric:!1,content:d?a.substr(c,d):a.substr(c)};case "position":return c=a.getValue(b.needle),a=a.getValue(b.haystack),{type:"constant",
     82numeric:!0,content:b.last?a.lastIndexOf(c):a.indexOf(c)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(b.callback).payload};case "modulo":return c=a.getSymbolRecord(b.name),a=a.evaluate(b.value),{type:"constant",numeric:!0,content:c.value[c.index].content%a.content};case "format":c=a.getSymbolRecord(b.name);c=1E3*a.getValue(c.value[c.index]);try{switch(d=JSON.parse(a.getValue(b.value)),d.mode){case "time":return{type:"constant",numeric:!0,content:(new Date(c)).toLocaleTimeString(d.locale,
     83d.options)};default:return{type:"constant",numeric:!0,content:(new Date(c)).toLocaleDateString(d.locale,d.options)}}}catch(g){a.runtimeError(a[a.pc].lino,"Can't parse "+b.value);break}case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Math.floor(Date.now()/1E3)};case "today":return a=new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0,content:Math.floor(a.getTime()/1E3)};case "date":return{type:"constant",numeric:!0,content:Date.parse(a.getValue(b.value))/
     841E3};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"<br />"};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(b.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(b.value))};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(b.value).toLowerCase()};case "hash":a=a.getValue(b.value);b=0;if(0===a.length)return b;for(c=0;c<a.length;c++)d=a.charCodeAt(c),
     85b=(b<<5)-b+d;return{type:"constant",numeric:!0,content:b};case "element":c=a.getValue(b.element);b=a.getSymbolRecord(b.symbol);d="";try{d=JSON.parse(a.getValue(b.value[b.index]))[c]}catch(g){a.runtimeError(a[a.pc].lino,"Can't parse JSON");break}return{type:"constant",numeric:!1,content:"object"===typeof d?JSON.stringify(d):d};case "property":d=a.getValue(b.property);b=a.getSymbolRecord(b.symbol);a=a.getValue(b.value[b.index]);c="";if(d&&a)if("object"===typeof a)c=a[d];else if("{"===a.charAt(0))try{c=
     86JSON.parse(a)[d]}catch(g){console.log("Can't parse '"+a+"': "+g.message)}return{type:"constant",numeric:!isNaN(c),content:"object"===typeof c?JSON.stringify(c):c};case "module":return{type:"boolean",numeric:!1,content:a.getSymbolRecord(b.name).program};case "message":return c=a.message,{type:"constant",numeric:!1,content:c};case "error":return c=a.errorMessage,{type:"constant",numeric:!1,content:c};case "indexOf":d=a.getValue(b.value1);b=a.getValue(b.value2);try{return c=JSON.parse(b).indexOf(d),
     87{type:"constant",numeric:!0,content:c}}catch(g){a.runtimeError(a[a.pc].lino,"Can't parse "+b)}break;case "arg":return c=a.getValue(b.value),c=a.getSymbolRecord(b.target)[c],{type:"constant",numeric:!isNaN(c),content:c}}return null},put:function(a,b){a.value[a.index]=b}},condition:{compile:function(a){if(a.isSymbol()){var b=a.getSymbolRecord();if("module"===b.keyword){if(a.nextTokenIs("is")){var d=!0;a.nextTokenIs("not")&&(a.next(),d=!1);if(a.tokenIs("running"))return a.next(),{domain:"core",type:"moduleRunning",
     88name:b.name,sense:d}}return null}}if(a.tokenIs("not"))return{domain:"core",type:"not",value:a.getNextValue()};try{if(d=a.getValue(),"is"===a.getToken()){a.next();var f=c.isNegate(a);switch(a.getToken()){case "numeric":return a.next(),{domain:"core",type:"numeric",value1:d};case "even":return a.next(),{domain:"core",type:"even",value1:d};case "odd":return a.next(),{domain:"core",type:"odd",value1:d};case "greater":a.next();if(a.tokenIs("than")){a.next();var g=a.getValue();return{domain:"core",type:"greater",
     89value1:d,value2:g,negate:f}}break;case "less":a.next();if(a.tokenIs("than")){a.next();var l=a.getValue();return{domain:"core",type:"less",value1:d,value2:l,negate:f}}break;default:var n=a.getValue();return{domain:"core",type:"is",value1:d,value2:n,negate:f}}}else if(d)return{domain:"core",type:"boolean",value:d}}catch(p){return a.warning("Can't get a value"),0}return null},test:function(a,b){switch(b.type){case "boolean":return a.getValue(b.value);case "numeric":return!isNaN(a.getValue(b.value1));
     90case "even":return 0===a.getValue(b.value1)%2;case "odd":return 1===a.getValue(b.value1)%2;case "is":return a=a.compare(a,b.value1,b.value2),b.negate?0!==a:0===a;case "greater":return a=a.compare(a,b.value1,b.value2),b.negate?0>=a:0<a;case "less":return a=a.compare(a,b.value1,b.value2),b.negate?0<=a:0>a;case "not":return!a.getValue(b.value);case "moduleRunning":return a=a.getSymbolRecord(b.name).program,b.sense?a:!a}return!1}}};k.exports=c},{}],6:[function(d,k,h){var f=this,c=d("./Compile"),a=d("./Run"),
     91b=d("./Value"),e=d("./Condition"),q=d("./Compare"),g={domain:{core:d("./Core")},runtimeError:function(a,b){this.lino=a;this.reportError({message:"Line "+(0<=a?a:"")+": "+b},g.program);g.program.aborted=!0},nonNumericValueError:function(a){this.runtimeError(a,"Non-numeric value")},variableDoesNotHoldAValueError:function(a,b){this.runtimeError(a,"Variable '"+b+"' does not hold a value")},reportError:function(a,b,d){if(a.message)if(this.compiling||b){d=d?d:b.source;var e=d.tokens;d=d.scriptLines;e=this.compiling?
     92e[c.getIndex()].lino:b[b.pc].lino;b=this.compiling?"Compile error":"Runtime error in '"+b.script+"'";b+=":\n";var l=e-5;for(l=0>l?0:l;l<e;l++){var n=(""+(l+1)).padStart(4," ");b+=n+" "+d[l].line.split("\\s").join(" ")+"\n"}b+=a.message+"\n";a=c.getWarnings();if(a.length)for(b+="Warnings:\n",a=$jscomp.makeIterator(a),d=a.next();!d.done;d=a.next())b+=d.value+"\n";console.log(b);alert(b)}else a="Error: "+a.message,alert(a),console.log(a);else console.log("An error occurred - origin was "+a.path[0])},
     93getSymbolRecord:function(a){a=this[this.symbols[a].pc];return a.alias?this.getSymbolRecord(a.alias):a.exporter&&a.exporter!=this?a.exporter.getSymbolRecord(a.exportedName):a},verifySymbol:function(a){return this.symbols.hasOwnProperty(a)},encode:function(a){return b.encode(a,this.encoding)},decode:function(a){return b.decode(a,this.encoding)},evaluate:function(a){return b.evaluate(this,a)},getValue:function(a){return b.getValue(this,a)},getFormattedValue:function(a){a=b.evaluate(this,a);if(a.numeric)return a.content;
     94if("boolean"===a.type)return a.content?"true":"false";if('{"'===a.content.substr(0,2)||"["===a.content[0])try{var c=JSON.parse(a.content);return JSON.stringify(c,null,2)}catch(p){return this.reportError(p),"{}"}return a.content},getSimpleValue:function(a){return!0===a||!1===a?{type:"boolean",content:a}:{type:"constant",numeric:Number.isInteger(a),content:a}},run:function(b){b&&(g.program=this,a.run(this,b))},exit:function(){a.exit(this)},register:function(a){g.program=a},require:function(a,b,c){var d=
     95document.createElement("css"===a?"link":"script");switch(a){case "css":d.type="text/css";d.href=b;d.rel="stylesheet";break;case "js":d.type="text/javascript";d.src=b;break;default:return}d.onload=function(){console.log(Date.now()-g.timestamp+" ms: Library "+b+" loaded");c()};document.head.appendChild(d)},isUndefined:function(a){return"undefined"===typeof a},runScript:function(a){var b=a[a.pc],c=a.getValue(b.script),d=b.imports,e=b.module?a.getSymbolRecord(b.module):null;try{g.tokeniseAndCompile(c.split("\n"),
     96d,e,this,b.then)}catch(v){this.reportError(v,g.program,a.source);a.onError?a.run(a.onError):a.parent&&a.parent.onError&&a.parent.run(a.parent.onError);return}b.nowait&&this.run(a.nextPc)},close:function(){},compileScript:function(a,d,f,h){var l=a.tokens;this.compiling=!0;c.value=b;c.condition=e;c.domain=g.domain;c.imports=d;d=c.compile(l);this.compiling=!1;d.EasyCoder=g;d.value=b;d.condition=e;d.compare=q;d.source=a;d.run=this.run;d.exit=this.exit;d.runScript=this.runScript;d.evaluate=this.evaluate;
     97d.getValue=this.getValue;d.getFormattedValue=this.getFormattedValue;d.getSimpleValue=this.getSimpleValue;d.encode=this.encode;d.decode=this.decode;d.domain=this.domain;d.require=this.require;d.isUndefined=this.isUndefined;d.checkPlugin=this.checkPlugin;d.getPlugin=this.getPlugin;d.addLocalPlugin=this.addLocalPlugin;d.getPluginsPath=this.getPluginsPath;d.getSymbolRecord=this.getSymbolRecord;d.verifySymbol=this.verifySymbol;d.runtimeError=this.runtimeError;d.nonNumericValueError=this.nonNumericValueError;
     98d.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;d.reportError=this.reportError;d.register=this.register;d.symbols=c.getSymbols();d.encoding="ec";d.popups=[];d.stack=[];d.queue=[0];d.module=f;d.parent=h;f&&(f.program=d);return d},tokeniseFile:function(a){var b=[],c=[],d=0;a.forEach(function(a,e){b.push({lino:e+1,line:a});for(var l=a.length,f="",g=!0,h=0;h<l;h++){var k=a[h];if(0==k.trim().length)g||(c.push({index:d,lino:e+1,token:f}),d++,f="",g=!0);else if(g=!1,"`"===k){for(m=h;++h<
     99a.length&&"`"!==a[h];);f=a.substr(m,h-m+1)}else if("!"==k)break;else f+=k}0<f.length&&c.push({index:d,lino:e+1,token:f})});return{scriptLines:b,tokens:c}},tokeniseAndCompile:function(b,c,d,e,f){var l=null,h=Date.now();b=g.tokeniseFile(b);try{l=g.compileScript(b,c,d,e);var k=Date.now();console.log(k-g.timestamp+" ms: "+("Compiled "+b.scriptLines.length+" lines ("+b.tokens.length+" tokens) in ")+(k-h+" ms"))}catch(r){"stop"!==r.message&&(c=g.program,this.reportError(r,c,b),c.onError&&c.run(c.onError))}l&&
     100(l.onExit=f,a.run(l,0))},tokenise:function(a){var b=a.split("\n");if(!f.tokenising){try{g.tokeniseAndCompile(b)}catch(p){g.reportError(p,null,a)}f.tokenising=!0}},setPluginCount:function(a){f.plugins=[];f.pluginCount=a},checkPlugin:function(a){return g.domain[a]},getPlugin:function(a,b,c){g.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+g.version,a.onload=function(){console.log(Date.now()-g.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},
     101addGlobalPlugin:function(a,b){f.plugins.push({name:a,handler:b});f.plugins.length===f.pluginCount&&(f.plugins.forEach(function(a){g.domain[a.name]=a.handler}),g.tokenise(f.source))},addLocalPlugin:function(a,b,c){g.domain[a]=b;c()},getPluginsPath:function(){return g.pluginsPath},loadPluginJs:function(a){console.log(Date.now()-g.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var b=document.createElement("script");b.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+g.version;b.type="text/javascript";
     102b.onload=function(){EasyCoder_Plugins.getGlobalPlugins(g.timestamp,a,g.setPluginCount,g.getPlugin,g.addGlobalPlugin)};b.onerror=function(){a?g.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):g.reportError({message:"Can't load plugins.js"},g.program,f.source)};document.head.appendChild(b);g.pluginsPath=a},start:function(a){f.source=a;a=window.location.pathname;a=a.endsWith("/")?a.slice(0,-1):"";g.loadPluginJs(a)}};k.exports=g},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Value":8}],
     1037:[function(d,k,h){var f={run:function(c,a){var b=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(b.length)b.push(a);else for(c.register(c),b.push(a);0<b.length;)for(c.pc=b.shift(),c.watchdog=0,a={};;){if(1E6<c.watchdog){c.lino=c[c.pc].lino;c.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",c),c);break}c.watchdog++;var h=c[c.pc].domain;c.debugStep&&console.log(c.script+
     104": Line "+c[c.pc].lino+": PC: "+c.pc+" "+h+":"+c[c.pc].keyword);var g=c.domain[h];if(!g){c.runtimeError(c[c.pc].lino,"Unknown domain '"+h+"'");break}c.pc=g.run(c);if(!c.pc)break;if(c.stop){c.tracing=!1;break}if(c.tracing){h=c[c.pc];g=c.source.scriptLines;var k=d(g),n=document.getElementById("easycoder-tracer");if(!n){c.runtimeError(h.lino,"Element 'easycoder-tracer' was not found");return}n.style.display="block";n.style.visibility="visible";var p="";if(c.tracer){if(n=document.getElementById("easycoder-tracer-content")){c.tracer.variables.forEach(function(a,
     105b,d){var e=c.getSymbolRecord(a);if(1<e.elements)for(p+=a+": "+e.index+"/"+e.elements+": ",a=0;a<e.elements;a++){var f=e.value[a];p=f?p+(f.content+" "):p+"undefined "}else p=(e=e.value[e.index])?p+(a+": "+e.content):p+(a+": undefined");switch(c.tracer.alignment){case "horizontal":b<d.length-1&&(p+=", ");break;case "vertical":p+="<br>"}});p+="<hr>";for(var u="",t=5;0<t;t--){if(h.lino){var v=g[h.lino-t].line.substr(k);u+='<input type="text" name="'+t+'"'+('value="'+(h.lino-t+1)+": "+v.split("\\s").join(" ")+
     106'"')+'style="width:100%;border:none;enabled:false">'}u+="<br>"}n.innerHTML=p+" "+u;n.style.display="block";a.run=document.getElementById("easycoder-run-button");a.step=document.getElementById("easycoder-step-button");a.run.onclick=function(a){return function(){a.run.blur();c.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{f.run(c,c.resume)}catch(r){var b="Error in run handler: "+r.message;console.log(b);alert(b)}}}(a);a.step.onclick=function(a){return function(){console.log("step");
     107a.step.blur();c.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{c.run(c.resume)}catch(r){var b="Error in step handler: "+r.message;console.log(b);alert(b)}}}(a)}c.resume=c.pc;c.pc=0}break}a={run:a.run,step:a.step}}},exit:function(c){c.onExit&&(c.parent.run(c.onExit),c.module.program=null)}};k.exports=f},{}],8:[function(d,k,h){var f={getItem:function(c){var a=c.getToken();if(!a)return null;if("true"===a)return c.next(),{type:"boolean",content:!0};if("false"===
     108a)return c.next(),{type:"boolean",content:!1};if("`"===a.charAt(0))return c.next(),{type:"constant",numeric:!1,content:a.substring(1,a.length-1)};if(a.charAt(0).match(/[0-9-]/)){var b=eval(a);if(Number.isInteger(b))return c.next(),{type:"constant",numeric:!0,content:b};throw Error("'"+a+"' is not an integer");}a=c.getIndex();b=$jscomp.makeIterator(Object.keys(c.domain));for(var d=b.next();!d.done;d=b.next())if(d=d.value,c.rewindTo(a),d=c.domain[d].value.compile(c))return d;return null},compile:function(c){var a=
     109c.getToken(),b=f.getItem(c);if(!b)throw Error("Undefined value: '"+a+"'");if("cat"===c.getToken()){for(a={type:"cat",numeric:!1,parts:[b]};c.tokenIs("cat");)c.next(),a.parts.push(c.value.getItem(c));return a}return b},doValue:function(c,a){if("undefined"===typeof a.type)return c.runtimeError(c[c.pc].lino,"Undefined value (variable not initialized?)"),null;switch(a.type){case "cat":return{type:"constant",numeric:!1,content:a.parts.reduce(function(a,b){return a+f.doValue(c,b).content},"")};case "boolean":case "constant":return a;
     110case "symbol":var b=c.getSymbolRecord(a.name);if(b.isValueHolder){if(a=b.value[b.index]){b=a.content;if(null===b||"undefined"===typeof b)a.content=a.numeric?0:"";return a}return null}return c.domain[b.domain].value.get(c,a)}return c.domain[a.domain].value.get(c,a)},constant:function(c,a){return{type:"constant",numeric:a,content:c}},evaluate:function(c,a){if(!a)return{type:"constant",numeric:!1,content:""};var b=f.doValue(c,a);if(b)return b;c.runtimeError(c[c.pc].lino,"Can't decode value: "+a)},getValue:function(c,
     111a){return f.evaluate(c,a).content},encode:function(c,a){if(c)switch(a){case "ec":return c.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(c.replace(/\s/g,"+"));case "sanitize":return c.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return c},decode:function(c,a){if(c)switch(a){case "ec":return c.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(c).replace(/\+/g,
     112" ")}return c}};k.exports=f},{}]},{},[1]);
  • easycoder/trunk/easycoder.js

    r2110632 r2118094  
    15491549            }
    15501550            const value = program.evaluate(command.value);
    1551             target.value[target.index] = value;
     1551            // target.value[target.index] = value;
     1552            target.value[target.index] = {
     1553                type: value.type,
     1554                numeric: value.numeric,
     1555                content: value.content
     1556            };
    15521557            if (target.imported) {
    15531558                const exporterRecord = target.exporter.getSymbolRecord(target.exportedName);
     
    26302635                };
    26312636            }
    2632             if (token === `empty`) {
    2633                 compiler.next();
    2634                 return {
    2635                     domain: `core`,
    2636                     type: `empty`
    2637                 };
    2638             }
    2639             if ([`now`, `today`].includes(token)) {
     2637            if ([`now`, `today`, `newline`, `break`, `empty`].includes(token)) {
    26402638                compiler.next();
    26412639                return {
     
    26442642                };
    26452643            }
    2646             if (token === `newline`) {
    2647                 compiler.next();
     2644            if (token === `date`) {
     2645                const value = compiler.getNextValue();
    26482646                return {
    26492647                    domain: `core`,
    2650                     type: `newline`
    2651                 };
    2652             }
    2653             if (token === `break`) {
    2654                 compiler.next();
    2655                 return {
    2656                     domain: `core`,
    2657                     type: `break`
     2648                    type: `date`,
     2649                    value
    26582650                };
    26592651            }
     
    30203012                        content: Math.floor(date.getTime() / 1000)
    30213013                    };
     3014                case `date`:
     3015                    return {
     3016                        type: `constant`,
     3017                        numeric: true,
     3018                        content: Date.parse(program.getValue(value.value)) / 1000
     3019                    };
    30223020                case `newline`:
    30233021                    return {
     
    33033301var _this = this;
    33043302
    3305 const EasyCoder_Tokenise = require(`./Tokenise`);
    33063303const EasyCoder_Compiler = require(`./Compile`);
    33073304const EasyCoder_Run = require(`./Run`);
     
    34053402        if (v.numeric) {
    34063403            return v.content;
     3404        }
     3405        if (v.type === `boolean`) {
     3406            return v.content ? `true` : `false`;
    34073407        }
    34083408        if (v.content.substr(0, 2) === `{"` || v.content[0] === `[`) {
     
    34793479        const moduleRecord = command.module ? program.getSymbolRecord(command.module) : null;
    34803480        try {
    3481             EasyCoder.tokeniseScript(script.split(`\n`), imports, moduleRecord, this, command.then);
     3481            EasyCoder.tokeniseAndCompile(script.split(`\n`), imports, moduleRecord, this, command.then);
    34823482        } catch (err) {
    34833483            this.reportError(err, EasyCoder.program, program.source);
     
    35013501        } = source;
    35023502        this.compiling = true;
    3503         const startCompile = Date.now();
    35043503        const compiler = EasyCoder_Compiler;
    35053504        compiler.value = EasyCoder_Value;
     
    35083507        compiler.imports = imports;
    35093508        const program = EasyCoder_Compiler.compile(tokens);
    3510         const finishCompile = Date.now();
    3511         console.log(`${finishCompile - EasyCoder.timestamp} ms: Compiled ${tokens.length} tokens in ` + `${finishCompile - startCompile} ms`);
    35123509        //    console.log('Program: ' + JSON.stringify(program, null, 2));
    35133510        this.compiling = false;
     
    35543551    },
    35553552
    3556     tokeniseScript: function (file, imports, module, parent, then) {
     3553    tokeniseFile: file => {
     3554        const scriptLines = [];
     3555        const tokens = [];
     3556        let index = 0;
     3557        file.forEach(function (line, lino) {
     3558            scriptLines.push({
     3559                lino: lino + 1,
     3560                line
     3561            });
     3562            const len = line.length;
     3563            let token = ``;
     3564            let inSpace = true;
     3565            for (let n = 0; n < len; n++) {
     3566                const c = line[n];
     3567                if (c.trim().length == 0) {
     3568                    if (inSpace) {
     3569                        continue;
     3570                    }
     3571                    tokens.push({
     3572                        index,
     3573                        lino: lino + 1,
     3574                        token
     3575                    });
     3576                    index++;
     3577                    token = ``;
     3578                    inSpace = true;
     3579                    continue;
     3580                }
     3581                inSpace = false;
     3582                if (c === `\``) {
     3583                    m = n;
     3584                    while (++n < line.length) {
     3585                        if (line[n] === `\``) {
     3586                            break;
     3587                        }
     3588                    }
     3589                    token = line.substr(m, n - m + 1);
     3590                } else if (c == `!`) {
     3591                    break;
     3592                } else {
     3593                    token += c;
     3594                }
     3595            }
     3596            if (token.length > 0) {
     3597                tokens.push({
     3598                    index,
     3599                    lino: lino + 1,
     3600                    token
     3601                });
     3602            }
     3603        });
     3604        return { scriptLines, tokens };
     3605    },
     3606
     3607    tokeniseAndCompile: function (file, imports, module, parent, then) {
    35573608        //  console.log('Tokenise script: ');
    35583609        let program = null;
    3559         const startTokenise = Date.now();
    3560         const source = EasyCoder_Tokenise.tokenise(file);
    3561         const finishTokenise = Date.now();
    3562         console.log(`${finishTokenise - EasyCoder.timestamp} ms: Tokenised ${source.scriptLines.length} lines in ` + `${finishTokenise - startTokenise} ms`);
    3563         //  console.log('Source: ' + JSON.stringify(source, null, 2));
     3610        const startCompile = Date.now();
     3611        // const source = EasyCoder_Tokenise.tokenise(file);
     3612        const source = EasyCoder.tokeniseFile(file);
    35643613        try {
    35653614            program = EasyCoder.compileScript(source, imports, module, parent);
     3615            const finishCompile = Date.now();
     3616            console.log(`${finishCompile - EasyCoder.timestamp} ms: ` + `Compiled ${source.scriptLines.length} lines (${source.tokens.length} tokens) in ` + `${finishCompile - startCompile} ms`);
    35663617        } catch (err) {
    35673618            if (err.message !== `stop`) {
     
    35793630    },
    35803631
    3581     tokenize: source => {
     3632    tokenise: source => {
    35823633        const script = source.split(`\n`);
    35833634        if (!_this.tokenising) {
    35843635            try {
    3585                 EasyCoder.tokeniseScript(script);
     3636                EasyCoder.tokeniseAndCompile(script);
    35863637            } catch (err) {
    35873638                EasyCoder.reportError(err, null, source);
     
    36243675                EasyCoder.domain[plugin.name] = plugin.handler;
    36253676            });
    3626             EasyCoder.tokenize(_this.source);
     3677            EasyCoder.tokenise(_this.source);
    36273678        }
    36283679    },
     
    36713722
    36723723module.exports = EasyCoder;
    3673 },{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Tokenise":8,"./Value":9}],7:[function(require,module,exports){
     3724},{"./Compare":2,"./Compile":3,"./Condition":4,"./Core":5,"./Run":7,"./Value":8}],7:[function(require,module,exports){
    36743725const EasyCoder_Run = {
    36753726
     
    38393890module.exports = EasyCoder_Run;
    38403891},{}],8:[function(require,module,exports){
    3841 const EasyCoder_Tokenise = {
    3842 
    3843     markComments: ({
    3844         list,
    3845         index = 0,
    3846         inComment = false,
    3847         newList = []
    3848     }) => {
    3849         if (index >= list.length) {
    3850             return newList;
    3851         }
    3852         const item = list[index];
    3853         const { lino, token } = item;
    3854 
    3855         const noCommentParams = {
    3856             list,
    3857             index: index + 1,
    3858             inComment: false,
    3859             newList: newList.concat({ lino, index, token })
    3860         };
    3861         const inCommentParams = {
    3862             list,
    3863             index: index + 1,
    3864             inComment: true,
    3865             newList: newList.concat({ lino, index, comment: true, token })
    3866         };
    3867 
    3868         if (inComment && index > 0 && lino === list[index - 1].lino) {
    3869             // in a comment
    3870             return EasyCoder_Tokenise.markComments(inCommentParams);
    3871         } else {
    3872             if (token.charAt(0) === `!`) {
    3873                 // a new comment
    3874                 return EasyCoder_Tokenise.markComments(inCommentParams);
    3875             } else {
    3876                 return EasyCoder_Tokenise.markComments(noCommentParams);
    3877             }
    3878         }
    3879     },
    3880 
    3881     findStrings: ({
    3882         original,
    3883         line,
    3884         inComment = false,
    3885         inQuote = false
    3886     }) => {
    3887         const c = line.charAt(0);
    3888         const ch = inQuote && [` `, `\\t`].includes(c) ? `\\s` : c;
    3889         if (line.length === 1) {
    3890             return ch;
    3891         } else {
    3892             const tail = line.substring(1);
    3893             if (c === `!` && !inQuote) {
    3894                 return c + EasyCoder_Tokenise.findStrings({ original, line: tail, inComment: true, inQuote: false });
    3895             }
    3896             if (c === `\`` && !inComment && !inQuote) {
    3897                 return c + EasyCoder_Tokenise.findStrings({ original, line: tail, inComment, inQuote: true });
    3898             }
    3899             if (c === `\`` && inQuote) {
    3900                 return c + EasyCoder_Tokenise.findStrings({ original, line: tail, inComment, inQuote: false });
    3901             }
    3902             if (!inComment && !inQuote && !c.match(/[A-z0-9_\-+*/\- \t]/)) {
    3903                 if ([`'`, `"`].includes(c)) {
    3904                     throw new Error(`Bad syntax in "${original}":\nStrings in EasyCoder must be enclosed in backticks.`);
    3905                 } else {
    3906                     throw new Error(`Unrecognised character "${c}" in\n"${original}".`);
    3907                 }
    3908             }
    3909             return ch + EasyCoder_Tokenise.findStrings({ original, line: tail, inComment, inQuote });
    3910         }
    3911     },
    3912 
    3913     tokenise: file => {
    3914         const replaceAll = (target, search, replacement) => {
    3915             return target.split(search).join(replacement);
    3916         };
    3917 
    3918         // Convert quoted spaces to \\s
    3919         const markedSpaces = file.map(original => {
    3920             const line = original.trim();
    3921             if (line.length) {
    3922                 return EasyCoder_Tokenise.findStrings({ original, line });
    3923             }
    3924             return ``;
    3925         });
    3926 
    3927         // Convert to an array of lines
    3928         const scriptLines = markedSpaces.map((line, lino) => {
    3929             return { lino: lino + 1, line };
    3930         });
    3931 
    3932         // Convert to an array of tokens within lines
    3933         const lines = scriptLines.map(line => {
    3934             const items = line.line.trim().split(/\s+/);
    3935             const tokens = items.map((token, index) => {
    3936                 return { lino: line.lino, index, token: token };
    3937             });
    3938             return tokens;
    3939         });
    3940 
    3941         // merge all the lines into an array of tokens
    3942         const merged = [].concat.apply([], lines);
    3943 
    3944         // filter out empty tokens
    3945         const filtered = merged.filter(item => {
    3946             return item.token;
    3947         });
    3948 
    3949         // Convert \\s to space
    3950         const quoted = filtered.map(line => {
    3951             return { lino: line.lino, index: line.index, token: replaceAll(line.token, `\\s`, ` `) };
    3952         });
    3953 
    3954         // Mark comments for removal
    3955         const marked = EasyCoder_Tokenise.markComments({ list: quoted });
    3956 
    3957         // filter out comments
    3958         const tokens = marked.filter(item => {
    3959             return !item.comment;
    3960         });
    3961 
    3962         return { scriptLines, tokens };
    3963     }
    3964 };
    3965 
    3966 module.exports = EasyCoder_Tokenise;
    3967 },{}],9:[function(require,module,exports){
    39683892const EasyCoder_Value = {
    39693893
  • easycoder/trunk/easycoder.php

    r2110632 r2118094  
    44  * Plugin URI: https://easycoder.software
    55  * Description: Control the appearance and behavior of your posts and pages by embedding simple English-like scripts, without the need to learn JavaScript.
    6   * Version: 2.4.2
     6  * Version: 2.4.3
    77  * Author: EasyCoder Software
    88  * Author URI: https://easycoder.software
     
    1717  function easycoder_enqueue_script() {   
    1818    wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ )
    19             . 'easycoder-min.js', array(), '2.4.2');
     19            . 'easycoder-min.js', array(), '2.4.3');
    2020  }
    2121 
  • easycoder/trunk/plugins/browser.js

    r2110632 r2118094  
    665665    },
    666666
     667    Highlight: {
     668
     669        compile: (compiler) => {
     670            const lino = compiler.getLino();
     671            if (compiler.nextIsSymbol()) {
     672                const symbolRecord = compiler.getSymbolRecord();
     673                if (symbolRecord.extra === `dom`) {
     674                    compiler.next();
     675                    compiler.addCommand({
     676                        domain: `browser`,
     677                        keyword: `highlight`,
     678                        lino,
     679                        name: symbolRecord.name
     680                    });
     681                    return true;
     682                }
     683            }
     684            return false;
     685        },
     686
     687        run: (program) => {
     688            const command = program[program.pc];
     689            const targetRecord = program.getSymbolRecord(command.name);
     690            const element = targetRecord.element[targetRecord.index];
     691            element.select();
     692            return command.pc + 1;
     693        }
     694    },
     695
    667696    History: {
    668697
     
    21572186        case `h6`:
    21582187            return EasyCoder_Browser.H6;
     2188        case `highlight`:
     2189            return EasyCoder_Browser.Highlight;
    21592190        case `history`:
    21602191            return EasyCoder_Browser.History;
  • easycoder/trunk/readme.txt

    r2110632 r2118094  
    3232*EasyCoder* scripts are embedded in your page or post, inside a special "preformatted" tag. When the page loads, *EasyCoder* looks for this element then compiles and runs the script it contains. When it interacts with HTML elements it attaches their IDs to its own variables, so your HTML and its controlling script are in the same file.
    3333
    34 The *EasyCoder* core module is currently about 56k bytes in its minimised form and it downloads its own plugin modules from a growing library. Its performance is good because it precompiles scripts - a process that takes only tens of milliseconds - and the compiled code for each command is only a thin wrapper around the corresponding JavaScript functionality.
     34The *EasyCoder* core module is currently about 55k bytes in its minimised form and it downloads its own plugin modules from a growing library. Its performance is good because it precompiles scripts - a process that takes only tens of milliseconds - and the compiled code for each command is only a thin wrapper around the corresponding JavaScript functionality.
    3535
    3636When *EasyCoder* detects an error, either in compilation or at runtime, it opens a popup window with a friendly error message that tries to tell you what went wrong and where in the script it happened.
     
    5353
    5454== Changelog ==
     55
     56= 2.4.3 5-jul-2019 =
     57* Refactor for faster tokenizing
    5558
    5659= 2.4.2 22-jun-2019 =
  • easycoder/trunk/rest.php

    r2110632 r2118094  
    122122                        case '_load':
    123123                                // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_load/{path}
     124                                header("Content-Type: text/plain");
    124125                                $path = "../../../$resources/" . str_replace('~', '/', $request[0]);
    125126                                print file_get_contents($path);
     
    150151                                print file_get_contents('scripted');
    151152                                exit;
     153                        case '_eclist':
     154                                // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_eclist/[{path}]
     155                                // List the contents of a directory
     156                                if (count($request) && $request[0]) {
     157                                        $path = '/' . str_replace('~', '/', $request[0]);
     158                                }
     159                                $files = scandir(getcwd().$path);
     160                                print '[';
     161                                // First list all the directories
     162                                $flag = false;
     163                                foreach ($files as $file) {
     164                                        if (strpos($file, '.') !== 0) {
     165                                                if (is_dir("$path/$file")) {
     166                                                        if ($flag) {
     167                                                                print ',';
     168                                                        } else {
     169                                                                $flag = true;
     170                                                        }
     171                                                        print "{\"name\":\"$file\",\"type\":\"dir\"}";
     172                                                }
     173                                        }
     174                                }
     175                                // Now do the ordinary files
     176                                foreach ($files as $file) {
     177                                        if (strpos($file, '.') !== 0) {
     178                                            if (!is_dir("$path/$file")) {
     179                                                    if ($flag) {
     180                                                            print ',';
     181                                                    } else {
     182                                                            $flag = true;
     183                                                    }
     184                                                    $type = 'file';
     185                                                    $p = strrpos($file, '.');
     186                                                    if ($p > 0) {
     187                                                            $ext = substr($file, $p + 1);
     188                                                            $type = $ext;
     189                                                            switch (strtolower($ext)) {
     190                                                                    case 'jpg':
     191                                                                    case 'jpeg':
     192                                                                    case 'png':
     193                                                                    case 'gif':
     194                                                                            $type = 'img';
     195                                                                            break;
     196                                                            }
     197                                                    }
     198                                                    print "{\"name\":\"$file\",\"type\":\"$type\"}";
     199                                            }
     200                                    }
     201                                }
     202                                print ']';
     203                                exit;
    152204                        case '_ecload':
    153205                                // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_load/{path}
     206                                header("Content-Type: text/plain");
    154207                                $path = str_replace('~', '/', $request[0]);
    155208                                print file_get_contents($path);
     
    169222                                        $path = $_POST['path'];
    170223                                        $pathsegs = explode("/", $path);
    171                                         $path = str_replace('~', '/', $pathsegs[1]);
     224                                        $path = "../../../$upload/" . str_replace('~', '/', $pathsegs[1]);
     225                                        mkdir($path, 0777, true);
    172226                                        $fileName = $_FILES['source']['name'];
    173227                                        $tempName = $_FILES['source']['tmp_name'];
     
    175229                                        $fileSize = $_FILES['source']['size'];
    176230                                        $fileError = $_FILES['source']['error'];
    177                                         if (!move_uploaded_file($tempName, "../../../$upload/$path/$fileName")) {
     231                                        if (!move_uploaded_file($tempName, "$path/$fileName")) {
    178232                                                unlink($tempName);
    179233                                                http_response_code(400);
    180                                                 logger("Failed to upload $fileName to ../../../$upload/$path/$fileName.\ntempName: $tempName\nfileType: $fileType\nfileSize:$fileSize\nfileError: $fileError");
     234                                                logger("Failed to upload $fileName to $path/$fileName.\ntempName: $tempName\nfileType: $fileType\nfileSize:$fileSize\nfileError: $fileError");
    181235                                        } else {
    182236                                                logger("File $fileName uploaded successfully to $path/$fileName");
     
    249303                                        header("Content-Type: application/text");
    250304                                        $content = stripslashes(file_get_contents("php://input"));
     305//                                      print $content;
     306//                                      $content = str_replace('\\', '\\\\', $content);
     307                                        unlink($path);
    251308                                        file_put_contents($path, $content);
     309                                        exit;
     310                                case '_ecdelete':
     311                                        // Endpoint: {site root}/wp-content/plugins/easycoder/rest.php/_ecdelete/{path}
     312                                        $path = str_replace('~', '/', $request[0]);
     313                                        if (is_dir($path)) {
     314                                                rmdir($path);
     315                                        } else {
     316                                                unlink($path);
     317                                        }
    252318                                        exit;
    253319                        }
Note: See TracChangeset for help on using the changeset viewer.