@borgar/fx 1.1.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,6 +22,7 @@ The library is also provided as an ES6 module in an NPM package:
22
22
  |- | - | -
23
23
  | `emitRanges` | `false` | Adds offset ranges on the tokens: `{ range: [ start, end ] }`
24
24
  | `mergeRanges` | `true` | Should ranges be returned as whole references (`Sheet1!A1:B2`) or as separate tokens for each part: (`Sheet1`,`!`,`A1`,`:`,`B2`).
25
+ | `negativeNumbers` | `false` | Merges all unary minuses with their immediately following number tokens (`-`,`1`) => `-1`
25
26
  | `r1c1` | `false` | Ranges are expected to be in the R1C1 style format rather than the more popular A1 style.
26
27
 
27
28
  The returned output will be an array of objects representing the tokens:
@@ -59,6 +60,15 @@ tokenTypes = {
59
60
  }
60
61
  ```
61
62
 
63
+ To support syntax highlighting as you type, `STRING`, `PATH_BRACE`, and `PATH_QUOTE` tokens are allowed to be "unterminated". For example, the incomplete formula `="Hello world` would be tokenized as:
64
+
65
+ ```js
66
+ [
67
+ { type: FX_PREFIX, value: '=' },
68
+ { type: STRING, value: '"Hello world', unterminated: true },
69
+ ]
70
+ ```
71
+
62
72
  ### <a name="translateToA1" href="#translateToA1">#</a> **translateToA1**( _formula, anchorCell_ )
63
73
 
64
74
  Translates ranges in a formula from relative R1C1 syntax to absolute A1 syntax.
@@ -106,13 +116,13 @@ The returned output will be the same array of tokens but the following propertie
106
116
 
107
117
  Matching parens will be tagged with `.groupId` string identifier as well as a `.depth` number value (indicating the level of nesting).
108
118
 
109
- Parens without a counterpart will be tagged with `.error` (boolean true).
119
+ Closing parens without a counterpart will be tagged with `.error` (boolean true).
110
120
 
111
121
  #### Curly brackets { }
112
122
 
113
123
  Matching curly brackets will be tagged with `.groupId` string identifier. These may not be nested in Excel.
114
124
 
115
- Curly brackets without a counterpart will be tagged with `.error` (boolean `true`).
125
+ Closing curly brackets without a counterpart will be tagged with `.error` (boolean `true`).
116
126
 
117
127
  #### Ranges (`RANGE` or `RANGE_BEAM` type tokens)
118
128
 
package/dist/fx.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";function quickVerifyRangeA1(e){return e.split(/(\d+|[a-zA-Z]+)/).every(e=>{var t=parseInt(e,36);return!!isNaN(t)||(isFinite(e)?t<=2183880786:t<=43321)})}Object.defineProperty(exports,"__esModule",{value:!0});const bounds={R:1048577,"R[":1048576,C:16385,"C[":16384};function quickVerifyRangeRC(e){const t=/([RC]\[?)(-?\d+)/gi;for(;null!==(o=t.exec(e));){var r=bounds[o[1]],o=parseInt(o[2],10);if(r<=o||o<=-r)return!1}return!0}const OPERATOR="operator",BOOLEAN="bool",ERROR="error",NUMBER="number",FUNCTION="function",NEWLINE="newline",WHITESPACE="whitespace",STRING="string",PATH_QUOTE="path-quote",PATH_BRACE="path-brace",PATH_PREFIX="path-prefix",RANGE="range",RANGE_BEAM="range-beam",RANGE_NAMED="range-named",FX_PREFIX="fx-prefix",UNKNOWN="unknown",MAX_COLS=16383,MAX_ROWS=1048575,re_ERROR=/^#(NAME\?|FIELD!|CALC!|VALUE!|REF!|DIV\/0!|NULL!|NUM!|N\/A|GETTING_DATA\b|SPILL!|UNKNOWN!|FIELD\b|CALC\b|SYNTAX\?|ERROR!)/i,re_OPERATOR=/^(<=|>=|<>|[-+/*^%&<>=]|[{},;]|[()]|@|:|!|#)/,re_BOOLEAN=/^(TRUE|FALSE)\b/i,re_FUNCTION=/^[A-Z]+(?=\s*\()/i,re_NEWLINE=/^\n+/,re_WHITESPACE=/^\s+/,re_STRING=/^"(?:""|[^"])*("|$)/,re_PATH_QUOTE=/^'(?:''|[^'])*('|$)/,re_PATH_BRACE=/^\[(?:[^\]])+(\]|$)/,re_PATH_PREFIX=/^([^ \t\n$!"`'#%&(){}<>,;:^@|~=*+-]+)(?=!)/,re_A1COL=/^\$?[A-Z]{1,3}:\$?[A-Z]{1,3}/i,re_A1ROW=/^\$?[1-9][0-9]{0,6}:\$?[1-9][0-9]{0,6}/i,re_A1RANGE=/^\$?[A-Z]{1,3}\$?[1-9][0-9]{0,6}/i,rPart="(?:R(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,6})?)",cPart="(?:C(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,4})?)",re_RCCOL=new RegExp("^".concat(cPart,"(:").concat(cPart,")?(?=\\W|$)"),"i"),re_RCROW=new RegExp("^".concat(rPart,"(:").concat(rPart,")?(?=\\W|$)"),"i"),re_RCRANGE=new RegExp("^(?:(?=[RC])".concat(rPart).concat(cPart,")"),"i"),re_NUMBER=/^(?:\d+(\.\d+)?(?:[eE][+-]?\d+)?|\d+)/,re_NAMED=/^[A-Z\d\\_.?]+/i,tokenHandlersA1=[[ERROR,re_ERROR],[OPERATOR,re_OPERATOR],[BOOLEAN,re_BOOLEAN],[FUNCTION,re_FUNCTION],[NEWLINE,re_NEWLINE],[WHITESPACE,re_WHITESPACE],[STRING,re_STRING],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_A1RANGE,quickVerifyRangeA1],[RANGE_BEAM,re_A1COL,quickVerifyRangeA1],[RANGE_BEAM,re_A1ROW,quickVerifyRangeA1],[NUMBER,re_NUMBER],[RANGE_NAMED,re_NAMED]],tokenHandlersRC=[[ERROR,re_ERROR],[OPERATOR,re_OPERATOR],[BOOLEAN,re_BOOLEAN],[FUNCTION,re_FUNCTION],[NEWLINE,re_NEWLINE],[WHITESPACE,re_WHITESPACE],[STRING,re_STRING],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_RCRANGE,quickVerifyRangeRC],[RANGE_BEAM,re_RCROW,quickVerifyRangeRC],[RANGE_BEAM,re_RCCOL,quickVerifyRangeRC],[NUMBER,re_NUMBER],[RANGE_NAMED,re_NAMED]],tokenHandlersRefsA1=[[OPERATOR,/^[!:]/],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_A1RANGE,quickVerifyRangeA1],[RANGE_BEAM,re_A1COL,quickVerifyRangeA1],[RANGE_BEAM,re_A1ROW,quickVerifyRangeA1],[RANGE_NAMED,re_NAMED]],tokenHandlersRefsRC=[[OPERATOR,/^!/],[PATH_QUOTE,re_PATH_QUOTE],[PATH_BRACE,re_PATH_BRACE],[PATH_PREFIX,re_PATH_PREFIX],[RANGE,re_RCRANGE,quickVerifyRangeRC],[RANGE_BEAM,re_RCROW,quickVerifyRangeRC],[RANGE_BEAM,re_RCCOL,quickVerifyRangeRC],[RANGE_NAMED,re_NAMED]],isType=(e,t)=>e&&e.type===t,isRangeOp=e=>e&&":"===e.value,isBangOp=e=>e&&"!"===e.value;function getTokens(o){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:[],R=2<arguments.length&&void 0!==arguments[2]&&arguments[2],a=3<arguments.length&&void 0!==arguments[3]&&arguments[3];const A=[];let E=0;var e,i=e=>A[A.length-e];for(/^=/.test(o)&&(e={type:FX_PREFIX,value:"=",...R?{range:[0,1]}:{}},E++,A.push(e));E<o.length;){var l=E,p=o.slice(E);let t="",r="";for(let e=0;e<n.length;e++){const[N,_,f]=n[e];var u=_.exec(p);if(u&&(!f||f(u[0]))){t=N,r=u[0],E+=u[0].length;break}}t||(t=UNKNOWN,r=o[E],E++);let e={type:t,value:r,...R?{range:[l,E]}:{}};if(a&&(t===RANGE||t===RANGE_NAMED||t===RANGE_BEAM)){const c=[];isRangeOp(i(1))&&isType(i(2),RANGE)&&t===RANGE&&c.unshift(...A.splice(-2,2)),isBangOp(i(1))&&(isType(i(2),PATH_QUOTE)||isType(i(2),PATH_BRACE)?c.unshift(...A.splice(-2,2)):isType(i(2),PATH_PREFIX)&&(l=isType(i(3),PATH_BRACE)?3:2,c.unshift(...A.splice(-l,l)))),c.length&&(e={type:t,value:c.map(e=>e.value).join("")+r,...R?{range:[c[0].range[0],E]}:{}})}A.push(e)}return A}function tokenize(e){var{emitRanges:t=!1,mergeRanges:r=!0,r1c1:o=!1}=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};return getTokens(e,o?tokenHandlersRC:tokenHandlersA1,t,r)}const unquote=e=>e.slice(1,-1).replace(/''/g,"'"),pRangeOp=e=>e&&":"===e.value&&{},pRange=e=>e&&e.type===RANGE&&{r0:e.value},pRange2=e=>e&&e.type===RANGE&&{r1:e.value},pBang=e=>e&&"!"===e.value&&{},pBeam=e=>e&&e.type===RANGE_BEAM&&{r0:e.value},pSheet=e=>e&&e.type===PATH_PREFIX&&/^[^:\\/?*[\]]{0,31}$/.test(e.value)&&{sheetName:e.value},pFile=e=>e&&e.type===PATH_BRACE&&{workbookName:e.value.slice(1,-1)},pFile2=e=>e&&e.type===PATH_PREFIX&&{workbookName:e.value},pNamed=e=>e&&e.type===RANGE_NAMED&&{name:e.value},pQuoted=e=>{if(e&&e.type===PATH_QUOTE){var t=/(?:\[(.+?)\])?([^[\]]+?)$/.exec(unquote(e.value));if(t){var[,e,t]=t;if(!t||/^[^:\\/?*[\]]{0,31}$/.test(t))return{workbookName:e||"",sheetName:t||""}}}},pQuoted2=e=>e&&e.type===PATH_QUOTE&&{workbookName:unquote(e.value)},validRuns=[[pRange],[pRange,pRangeOp,pRange2],[pBeam],[pQuoted,pBang,pRange],[pQuoted,pBang,pRange,pRangeOp,pRange2],[pQuoted,pBang,pBeam],[pSheet,pBang,pRange],[pSheet,pBang,pRange,pRangeOp,pRange2],[pSheet,pBang,pBeam],[pFile,pSheet,pBang,pRange],[pFile,pSheet,pBang,pRange,pRangeOp,pRange2],[pFile,pSheet,pBang,pBeam]],validRunsNamed=validRuns.concat([[pNamed],[pFile2,pBang,pNamed],[pQuoted2,pBang,pNamed]]);function parseRef(e){var t=!(1<arguments.length&&void 0!==arguments[1])||arguments[1];const r=getTokens(e,2<arguments.length&&void 0!==arguments[2]?arguments[2]:[],!1,!1);var o={sheetName:"",workbookName:"",r0:"",r1:"",name:""};r.length&&r[0].type===FX_PREFIX&&r.shift();const n=t?validRunsNamed:validRuns;for(let e=0;e<n.length;e++){const R={...o};if(n[e].length===r.length)if(n[e].every((e,t)=>{t=e(r[t]);return Object.assign(R,t),t}))return R}return null}function fromCol(e){const t=(e||"").toUpperCase();let r=0,o=0;for(;o!==t.length;++o){var n=t.charCodeAt(o);65<=n&&n<=90&&(r=26*r+n-64)}return r-1}function toCol(e){let t=e,r="";for(;0<=t;)r=String.fromCharCode(t%26+65)+r,t=Math.floor(t/26)-1;return r}function fromRow(e){return+e-1}function toRow(e){return String(e+1)}function toRelative(e){var{top:t,left:r,bottom:o,right:e}=e;return{top:t,left:r,bottom:o,right:e,$left:!1,$right:!1,$top:!1,$bottom:!1}}function toAbsolute(e){var{top:t,left:r,bottom:o,right:e}=e;return{top:t,left:r,bottom:o,right:e,$left:!0,$right:!0,$top:!0,$bottom:!0}}function toA1(e){var t=e=>e?"$":"",{top:r,left:o,bottom:n,right:R,$left:a,$right:A,$top:E,$bottom:e}=e;return 0===r&&n===MAX_ROWS?t(a)+toCol(o)+":"+t(A)+toCol(R):0===o&&R===MAX_COLS?t(E)+toRow(r)+":"+t(e)+toRow(n):null==R||null==n||R===o&&n===r?t(a)+toCol(o)+t(E)+toRow(r):t(a)+toCol(o)+t(E)+toRow(r)+":"+t(A)+toCol(R)+t(e)+toRow(n)}function fromA1(e){let t,r=0,o=0,n=MAX_ROWS,R=MAX_COLS,a=!1,A=!1,E=!1,i=!1;if(t=/^(\$?)([A-Z]{1,3}):(\$?)([A-Z]{1,3})$/.exec(e)){var l=fromCol(t[2]),p=fromCol(t[4]);return o=Math.min(l,p),R=Math.max(l,p),A=!!t[l<=p?1:3],i=!!t[l<=p?3:1],a=!0,E=!0,{top:r,left:o,bottom:n,right:R,$top:a,$left:A,$bottom:E,$right:i}}if(t=/^(\$?)([1-9]\d{0,6}):(\$?)([1-9]\d{0,6})$/.exec(e)){var p=fromRow(t[2]),u=fromRow(t[4]);return r=Math.min(p,u),n=Math.max(p,u),a=!!t[p<=u?1:3],E=!!t[p<=u?3:1],A=!0,i=!0,{top:r,left:o,bottom:n,right:R,$top:a,$left:A,$bottom:E,$right:i}}var[u,e]=e.split(":");return(t=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(u))?(o=fromCol(t[2]),r=fromRow(t[4]),A=!!t[1],a=!!t[3],e&&(t=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(e))?(R=fromCol(t[2]),n=fromRow(t[4]),i=!!t[1],E=!!t[3],n<r&&([r,n,a,E]=[n,r,E,a]),R<o&&([o,R,A,i]=[R,o,i,A])):(n=r,R=o,E=a,i=A),{top:r,left:o,bottom:n,right:R,$top:a,$left:A,$bottom:E,$right:i}):null}function parseA1Ref(e){const t=parseRef(e,!(1<arguments.length&&void 0!==arguments[1])||arguments[1],tokenHandlersRefsA1);if(t&&(t.r0||t.name)){let e=null;return t.r0&&(e=t.r1?fromA1(t.r0+":"+t.r1):fromA1(t.r0)),t.name||e?(t.range=e,delete t.r0,delete t.r1,t):null}return null}var a1={fromCol:fromCol,toCol:toCol,toRelative:toRelative,toAbsolute:toAbsolute,to:toA1,from:fromA1,parse:parseA1Ref};function getIDer(){let e=1;return()=>"fxg"+e++}function addMeta(e){let{sheetName:n="",workbookName:R=""}=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};const a=[];let A=null;const E={},i=getIDer();return e.forEach(e=>{if("("===e.value)e.depth=a.length,a.push(e);else if(")"===e.value){const o=a.pop();var t;o?(t=i(),e.groupId=t,e.depth=o.depth,o.groupId=t):e.error=!0}else{var r;"{"===e.value?A?e.error=!0:A=e:"}"===e.value?(A?(r=i(),e.groupId=r,A.groupId=r):e.error=!0,A=null):e.type===RANGE||e.type===RANGE_BEAM?(r=(r=parseA1Ref(e.value,!1))&&"[".concat(r.workbookName||R,"]").concat(r.sheetName||n,"!").concat(r.range?toA1(toRelative(r.range)):r.name).toLowerCase())&&(r in E?e.groupId=E[r]:(e.groupId=i(),E[r]=e.groupId)):e.type===UNKNOWN&&(e.error=!0)}}),e}function toCoord(e,t){return t?String(e+1):e?"["+e+"]":""}function toRC(e){var{r0:t,c0:r,r1:o,c1:n,$c0:R,$c1:a,$r0:A,$r1:e}=e;if(0===t&&o===MAX_ROWS){var E=toCoord(r,R),i=toCoord(n,a);return"C"+(E===i?E:E+":C"+i)}if(0===r&&n===MAX_COLS){E=toCoord(t,A),i=toCoord(o,e);return"R"+(E===i?E:E+":R"+i)}A=toCoord(t,A),e=toCoord(o,e),R=toCoord(r,R),a=toCoord(n,a);return A!==e||R!==a?"R"+A+"C"+R+":R"+e+"C"+a:"R"+A+"C"+R}function parseRCPart(e){let t=0,r=0,o=MAX_ROWS,n=MAX_COLS,R=!1,a=!1,A=!1,E=!1;var i=/^R(?:\[([+-]?\d+)\]|(\d+))?/.exec(e);i?(i[1]?t=parseInt(i[1],10):i[2]&&(t=parseInt(i[2],10)-1,R=!0),o=t,A=R,e=e.slice(i[0].length)):(R=!0,A=!0);var l=/^C(?:\[([+-]?\d+)\]|(\d+))?/.exec(e);return l?(l[1]?r=parseInt(l[1],10):l[2]&&(r=parseInt(l[2],10)-1,a=!0),n=r,E=a,e=e.slice(l[0].length)):(a=!0,E=!0),!i&&!l||e.length?null:{r0:t,c0:r,r1:o,c1:n,$r0:R,$c0:a,$r1:A,$c1:E}}function fromRC(e){var[t,e]=e.split(":",2);const r=parseRCPart(t);if(!r)return null;if(r&&e){e=parseRCPart(e);if(!e)return null;r.r1=e.r1,r.c1=e.c1,r.$r1=e.$r1,r.$c1=e.$c1}return r}function parseRCRef(e){const t=parseRef(e,!(1<arguments.length&&void 0!==arguments[1])||arguments[1],tokenHandlersRefsRC);if(t&&(t.r0||t.name)){e=t.r1?fromRC(t.r0+":"+t.r1):fromRC(t.r0);return t.name||e?(t.range=e,delete t.r0,delete t.r1,t):null}return null}var rc={to:toRC,from:fromRC,parse:parseRCRef};function translateToRC(e,t){const{top:n,left:R}=fromA1(t);t="string"==typeof e;const r=t?tokenize(e,{emitRanges:!1,mergeRanges:!1,r1c2:!1}):e;return r.forEach(e=>{if(e.type===RANGE){const r={};var t=fromA1(e.value);r.r0=t.$top?t.top:t.top-n,r.$r0=t.$top,r.r1=t.$bottom?t.bottom:t.bottom-n,r.$r1=t.$bottom,r.c0=t.$left?t.left:t.left-R,r.$c0=t.$left,r.c1=t.$right?t.right:t.right-R,r.$c1=t.$right,e.value=toRC(r)}else if(e.type===RANGE_BEAM){const o={};t=fromA1(e.value);o.r0=t.$top?t.top:t.top-n,o.$r0=t.$top,o.r1=t.$bottom?t.bottom:t.bottom-n,o.$r1=t.$bottom,o.c0=t.$left?t.left:t.left-R,o.$c0=t.$left,o.c1=t.$right?t.right:t.right-R,o.$c1=t.$right,e.value=toRC(o)}}),t?r.map(e=>e.value).join(""):r}function toFixed(e,t,r,o){let n=e;return t||(n=r+e,n<0&&(n=o+n+1),n>o&&(n-=o+1)),n}function translateToA1(e,t){const R=fromA1(t);t="string"==typeof e;const r=t?tokenize(e,{emitRanges:!1,mergeRanges:!1,r1c1:!0}):e;return r.forEach(e=>{if(e.type===RANGE||e.type===RANGE_BEAM){const n={};var t=fromRC(e.value),r=toFixed(t.r0,t.$r0,R.top,MAX_ROWS),o=toFixed(t.r1,t.$r1,R.top,MAX_ROWS);o<r?(n.top=o,n.$top=t.$r1,n.bottom=r,n.$bottom=t.$r0):(n.top=r,n.$top=t.$r0,n.bottom=o,n.$bottom=t.$r1);r=toFixed(t.c0,t.$c0,R.left,MAX_COLS),o=toFixed(t.c1,t.$c1,R.left,MAX_COLS);o<r?(n.left=o,n.$left=t.$c1,n.right=r,n.$right=t.$c0):(n.left=r,n.$left=t.$c0,n.right=o,n.$right=t.$c1),e.value=toA1(n)}}),t?r.map(e=>e.value).join(""):r}const tokenTypes={OPERATOR:OPERATOR,BOOLEAN:BOOLEAN,ERROR:ERROR,NUMBER:NUMBER,FUNCTION:FUNCTION,NEWLINE:NEWLINE,WHITESPACE:WHITESPACE,STRING:STRING,PATH_QUOTE:PATH_QUOTE,PATH_BRACE:PATH_BRACE,PATH_PREFIX:PATH_PREFIX,RANGE:RANGE,RANGE_BEAM:RANGE_BEAM,RANGE_NAMED:RANGE_NAMED,FX_PREFIX:FX_PREFIX,UNKNOWN:UNKNOWN};exports.MAX_COLS=MAX_COLS,exports.MAX_ROWS=MAX_ROWS,exports.a1=a1,exports.addMeta=addMeta,exports.rc=rc,exports.tokenTypes=tokenTypes,exports.tokenize=tokenize,exports.translateToA1=translateToA1,exports.translateToRC=translateToRC;
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnguanMiLCJzb3VyY2VzIjpbIi4uL2xpYi9xdWlja1ZlcmlmeS5qcyIsIi4uL2xpYi9jb25zdGFudHMuanMiLCIuLi9saWIvbGV4ZXIuanMiLCIuLi9saWIvcGFyc2VSZWYuanMiLCIuLi9saWIvYTEuanMiLCIuLi9saWIvYWRkTWV0YS5qcyIsIi4uL2xpYi9yYy5qcyIsIi4uL2xpYi90cmFuc2xhdGUuanMiLCIuLi9saWIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHF1aWNrVmVyaWZ5UmFuZ2VBMSAodG9rZW5WYWx1ZSkge1xuICAvLyBRdWlja2x5IGRldGVybWluZSBpZiByYW5nZSB2YWx1cyBhcmUgb3V0IG9mIGJvdW5kczogU3BsaXQgdGhlIHN0cmluZyBpbnRvXG4gIC8vIG51bWVyaWMsIGFscGhhYmV0aWNhbCwgYW5kIFwib3RoZXJcIiBjaHVua3MgYW5kIHBhcnNlIHRoZW0gYXMgYmFzZSAzNiBudW1iZXJzLlxuICAvLyBCb3RoIHJvd3MgYW5kIGNvbHMgY2FuIGJlIHJlcHJlc2VudGVkIGluIGJhc2UgMzYgYW5kIHdlIGNhbiBkZWNpZGUgd2hpY2ggd2VcbiAgLy8gaG9sZCBieSBjaGVja2luZyBpZiB0aGUgY2h1bmsgd2FzIGFscmVhZHkgYSBmaW5pdGUgbnVtYmVyLiBTbyB3ZSBjYW4gc2ltcGx5XG4gIC8vIGNvbXBhcmUgYWdhaW5zdCB0aGUgYmFzZSAzNiBwYXJzZWQgdmVyc2lvbnMgb2YgWEZEIGFuZCAxMDQ4NTc2LlxuICByZXR1cm4gdG9rZW5WYWx1ZS5zcGxpdCgvKFxcZCt8W2EtekEtWl0rKS8pLmV2ZXJ5KGQgPT4ge1xuICAgIGNvbnN0IG4gPSBwYXJzZUludChkLCAzNik7XG4gICAgaWYgKCFpc05hTihuKSkge1xuICAgICAgcmV0dXJuIGlzRmluaXRlKGQpXG4gICAgICAgID8gbiA8PSAyMTgzODgwNzg2IC8vIG1heCByb3dzXG4gICAgICAgIDogbiA8PSA0MzMyMTsgICAgIC8vIG1heCBjb2xzXG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuY29uc3QgYm91bmRzID0ge1xuICAnUic6IDEwNDg1NzcsXG4gICdSWyc6IDEwNDg1NzYsXG4gICdDJzogMTYzODUsXG4gICdDWyc6IDE2Mzg0XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHF1aWNrVmVyaWZ5UmFuZ2VSQyAodG9rZW5WYWx1ZSkge1xuICBjb25zdCByZU51bXMgPSAvKFtSQ11cXFs/KSgtP1xcZCspL2dpO1xuICBsZXQgbTtcbiAgd2hpbGUgKChtID0gcmVOdW1zLmV4ZWModG9rZW5WYWx1ZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgeCA9IGJvdW5kc1ttWzFdXTtcbiAgICBjb25zdCB2YWwgPSBwYXJzZUludChtWzJdLCAxMCk7XG4gICAgaWYgKHZhbCA+PSB4IHx8IHZhbCA8PSAteCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IHF1aWNrVmVyaWZ5UmFuZ2VBMSwgcXVpY2tWZXJpZnlSYW5nZVJDIH0gZnJvbSAnLi9xdWlja1ZlcmlmeS5qcyc7XG5cbmV4cG9ydCBjb25zdCBPUEVSQVRPUiA9ICdvcGVyYXRvcic7XG5leHBvcnQgY29uc3QgQk9PTEVBTiA9ICdib29sJztcbmV4cG9ydCBjb25zdCBFUlJPUiA9ICdlcnJvcic7XG5leHBvcnQgY29uc3QgTlVNQkVSID0gJ251bWJlcic7XG5leHBvcnQgY29uc3QgRlVOQ1RJT04gPSAnZnVuY3Rpb24nO1xuZXhwb3J0IGNvbnN0IE5FV0xJTkUgPSAnbmV3bGluZSc7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRSA9ICd3aGl0ZXNwYWNlJztcbmV4cG9ydCBjb25zdCBTVFJJTkcgPSAnc3RyaW5nJztcbmV4cG9ydCBjb25zdCBQQVRIX1FVT1RFID0gJ3BhdGgtcXVvdGUnO1xuZXhwb3J0IGNvbnN0IFBBVEhfQlJBQ0UgPSAncGF0aC1icmFjZSc7XG5leHBvcnQgY29uc3QgUEFUSF9QUkVGSVggPSAncGF0aC1wcmVmaXgnO1xuZXhwb3J0IGNvbnN0IFJBTkdFID0gJ3JhbmdlJztcbmV4cG9ydCBjb25zdCBSQU5HRV9CRUFNID0gJ3JhbmdlLWJlYW0nO1xuZXhwb3J0IGNvbnN0IFJBTkdFX05BTUVEID0gJ3JhbmdlLW5hbWVkJztcbmV4cG9ydCBjb25zdCBGWF9QUkVGSVggPSAnZngtcHJlZml4JztcbmV4cG9ydCBjb25zdCBVTktOT1dOID0gJ3Vua25vd24nO1xuXG5leHBvcnQgY29uc3QgTUFYX0NPTFMgPSAyICoqIDE0IC0gMTsgLy8gMTYzODNcbmV4cG9ydCBjb25zdCBNQVhfUk9XUyA9IDIgKiogMjAgLSAxOyAvLyAxMDQ4NTc1XG5cbmNvbnN0IHJlX0VSUk9SID0gL14jKE5BTUVcXD98RklFTEQhfENBTEMhfFZBTFVFIXxSRUYhfERJVlxcLzAhfE5VTEwhfE5VTSF8TlxcL0F8R0VUVElOR19EQVRBXFxifFNQSUxMIXxVTktOT1dOIXxGSUVMRFxcYnxDQUxDXFxifFNZTlRBWFxcP3xFUlJPUiEpL2k7XG5jb25zdCByZV9PUEVSQVRPUiA9IC9eKDw9fD49fDw+fFstKy8qXiUmPD49XXxbe30sO118WygpXXxAfDp8IXwjKS87XG5jb25zdCByZV9CT09MRUFOID0gL14oVFJVRXxGQUxTRSlcXGIvaTtcbmNvbnN0IHJlX0ZVTkNUSU9OID0gL15bQS1aXSsoPz1cXHMqXFwoKS9pO1xuY29uc3QgcmVfTkVXTElORSA9IC9eXFxuKy87XG5jb25zdCByZV9XSElURVNQQUNFID0gL15cXHMrLztcbmNvbnN0IHJlX1NUUklORyA9IC9eXCIoPzpcIlwifFteXCJdKSooXCJ8JCkvO1xuY29uc3QgcmVfUEFUSF9RVU9URSA9IC9eJyg/OicnfFteJ10pKignfCQpLztcbmNvbnN0IHJlX1BBVEhfQlJBQ0UgPSAvXlxcWyg/OlteXFxdXSkrKFxcXXwkKS87XG5jb25zdCByZV9QQVRIX1BSRUZJWCA9IC9eKFteIFxcdFxcbiQhXCJgJyMlJigpe308Piw7Ol5AfH49KistXSspKD89ISkvOyAvLyBTaGVldHM6IFteOlxcXFwvPypbXFxdXXswLDMxfSAoYnV0IFdCIG5hbWVzPylcbmNvbnN0IHJlX0ExQ09MID0gL15cXCQ/W0EtWl17MSwzfTpcXCQ/W0EtWl17MSwzfS9pO1xuY29uc3QgcmVfQTFST1cgPSAvXlxcJD9bMS05XVswLTldezAsNn06XFwkP1sxLTldWzAtOV17MCw2fS9pO1xuY29uc3QgcmVfQTFSQU5HRSA9IC9eXFwkP1tBLVpdezEsM31cXCQ/WzEtOV1bMC05XXswLDZ9L2k7XG5jb25zdCByUGFydCA9ICcoPzpSKD86XFxcXFtbKy1dP1xcXFxkK1xcXFxdfFsxLTldWzAtOV17MCw2fSk/KSc7XG5jb25zdCBjUGFydCA9ICcoPzpDKD86XFxcXFtbKy1dP1xcXFxkK1xcXFxdfFsxLTldWzAtOV17MCw0fSk/KSc7XG5jb25zdCByZV9SQ0NPTCA9IG5ldyBSZWdFeHAoYF4ke2NQYXJ0fSg6JHtjUGFydH0pPyg/PVxcXFxXfCQpYCwgJ2knKTtcbmNvbnN0IHJlX1JDUk9XID0gbmV3IFJlZ0V4cChgXiR7clBhcnR9KDoke3JQYXJ0fSk/KD89XFxcXFd8JClgLCAnaScpO1xuY29uc3QgcmVfUkNSQU5HRSA9IG5ldyBSZWdFeHAoYF4oPzooPz1bUkNdKSR7clBhcnR9JHtjUGFydH0pYCwgJ2knKTtcbmNvbnN0IHJlX05VTUJFUiA9IC9eKD86XFxkKyhcXC5cXGQrKT8oPzpbZUVdWystXT9cXGQrKT98XFxkKykvO1xuY29uc3QgcmVfTkFNRUQgPSAvXltBLVpcXGRcXFxcXy4/XSsvaTsgLy8gRklYTUUgdGhlcmUgYXJlIHN0cmljdGVyIHJ1bGVzIGZvciB0aGlzIVxuLy8gY29uc3QgcmVfTkFNRUQgPSAvXig/IVtSQ10kKVtBLVrDgC3Is19cXFxcXVtcXFxcP1xcd8OALcizLl17MCwyNTV9JC9pO1xuXG5leHBvcnQgY29uc3QgdG9rZW5IYW5kbGVyc0ExID0gW1xuICBbIEVSUk9SLCAgICAgICByZV9FUlJPUiBdLFxuICBbIE9QRVJBVE9SLCAgICByZV9PUEVSQVRPUiBdLFxuICBbIEJPT0xFQU4sICAgICByZV9CT09MRUFOIF0sXG4gIFsgRlVOQ1RJT04sICAgIHJlX0ZVTkNUSU9OIF0sXG4gIFsgTkVXTElORSwgICAgIHJlX05FV0xJTkUgXSxcbiAgWyBXSElURVNQQUNFLCAgcmVfV0hJVEVTUEFDRSBdLFxuICBbIFNUUklORywgICAgICByZV9TVFJJTkcgXSxcbiAgWyBQQVRIX1FVT1RFLCAgcmVfUEFUSF9RVU9URSBdLFxuICBbIFBBVEhfQlJBQ0UsICByZV9QQVRIX0JSQUNFIF0sXG4gIFsgUEFUSF9QUkVGSVgsIHJlX1BBVEhfUFJFRklYIF0sXG4gIFsgUkFOR0UsICAgICAgIHJlX0ExUkFOR0UsIHF1aWNrVmVyaWZ5UmFuZ2VBMSBdLFxuICBbIFJBTkdFX0JFQU0sICByZV9BMUNPTCwgcXVpY2tWZXJpZnlSYW5nZUExIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX0ExUk9XLCBxdWlja1ZlcmlmeVJhbmdlQTEgXSxcbiAgWyBOVU1CRVIsICAgICAgcmVfTlVNQkVSIF0sXG4gIFsgUkFOR0VfTkFNRUQsIHJlX05BTUVEIF1cbl07XG5cbmV4cG9ydCBjb25zdCB0b2tlbkhhbmRsZXJzUkMgPSBbXG4gIFsgRVJST1IsICAgICAgIHJlX0VSUk9SIF0sXG4gIFsgT1BFUkFUT1IsICAgIHJlX09QRVJBVE9SIF0sXG4gIFsgQk9PTEVBTiwgICAgIHJlX0JPT0xFQU4gXSxcbiAgWyBGVU5DVElPTiwgICAgcmVfRlVOQ1RJT04gXSxcbiAgWyBORVdMSU5FLCAgICAgcmVfTkVXTElORSBdLFxuICBbIFdISVRFU1BBQ0UsICByZV9XSElURVNQQUNFIF0sXG4gIFsgU1RSSU5HLCAgICAgIHJlX1NUUklORyBdLFxuICBbIFBBVEhfUVVPVEUsICByZV9QQVRIX1FVT1RFIF0sXG4gIFsgUEFUSF9CUkFDRSwgIHJlX1BBVEhfQlJBQ0UgXSxcbiAgWyBQQVRIX1BSRUZJWCwgcmVfUEFUSF9QUkVGSVggXSxcbiAgWyBSQU5HRSwgICAgICAgcmVfUkNSQU5HRSwgcXVpY2tWZXJpZnlSYW5nZVJDIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX1JDUk9XLCBxdWlja1ZlcmlmeVJhbmdlUkMgXSxcbiAgWyBSQU5HRV9CRUFNLCAgcmVfUkNDT0wsIHF1aWNrVmVyaWZ5UmFuZ2VSQyBdLFxuICBbIE5VTUJFUiwgICAgICByZV9OVU1CRVIgXSxcbiAgWyBSQU5HRV9OQU1FRCwgcmVfTkFNRUQgXVxuXTtcblxuZXhwb3J0IGNvbnN0IHRva2VuSGFuZGxlcnNSZWZzQTEgPSBbXG4gIFsgT1BFUkFUT1IsICAgIC9eWyE6XS8gXSxcbiAgWyBQQVRIX1FVT1RFLCAgcmVfUEFUSF9RVU9URSBdLFxuICBbIFBBVEhfQlJBQ0UsICByZV9QQVRIX0JSQUNFIF0sXG4gIFsgUEFUSF9QUkVGSVgsIHJlX1BBVEhfUFJFRklYIF0sXG4gIFsgUkFOR0UsICAgICAgIHJlX0ExUkFOR0UsIHF1aWNrVmVyaWZ5UmFuZ2VBMSBdLFxuICBbIFJBTkdFX0JFQU0sICByZV9BMUNPTCwgcXVpY2tWZXJpZnlSYW5nZUExIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX0ExUk9XLCBxdWlja1ZlcmlmeVJhbmdlQTEgXSxcbiAgWyBSQU5HRV9OQU1FRCwgcmVfTkFNRUQgXVxuXTtcblxuZXhwb3J0IGNvbnN0IHRva2VuSGFuZGxlcnNSZWZzUkMgPSBbXG4gIFsgT1BFUkFUT1IsICAgIC9eIS8gXSxcbiAgWyBQQVRIX1FVT1RFLCAgcmVfUEFUSF9RVU9URSBdLFxuICBbIFBBVEhfQlJBQ0UsICByZV9QQVRIX0JSQUNFIF0sXG4gIFsgUEFUSF9QUkVGSVgsIHJlX1BBVEhfUFJFRklYIF0sXG4gIFsgUkFOR0UsICAgICAgIHJlX1JDUkFOR0UsIHF1aWNrVmVyaWZ5UmFuZ2VSQyBdLFxuICBbIFJBTkdFX0JFQU0sICByZV9SQ1JPVywgcXVpY2tWZXJpZnlSYW5nZVJDIF0sXG4gIFsgUkFOR0VfQkVBTSwgIHJlX1JDQ09MLCBxdWlja1ZlcmlmeVJhbmdlUkMgXSxcbiAgWyBSQU5HRV9OQU1FRCwgcmVfTkFNRUQgXVxuXTtcbiIsImltcG9ydCB7XG4gIEZYX1BSRUZJWCxcbiAgUEFUSF9CUkFDRSxcbiAgUEFUSF9QUkVGSVgsXG4gIFBBVEhfUVVPVEUsXG4gIFJBTkdFLFxuICBSQU5HRV9OQU1FRCxcbiAgUkFOR0VfQkVBTSxcbiAgVU5LTk9XTixcbiAgdG9rZW5IYW5kbGVyc0ExLFxuICB0b2tlbkhhbmRsZXJzUkNcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBpc1R5cGUgPSAodCwgdHlwZSkgPT4gdCAmJiB0LnR5cGUgPT09IHR5cGU7XG5jb25zdCBpc1JhbmdlT3AgPSB0ID0+IHQgJiYgdC52YWx1ZSA9PT0gJzonO1xuY29uc3QgaXNCYW5nT3AgPSB0ID0+IHQgJiYgdC52YWx1ZSA9PT0gJyEnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9rZW5zIChmeCwgdG9rZW5IYW5kbGVycyA9IFtdLCBlbWl0UmFuZ2VzID0gZmFsc2UsIG1lcmdlUmFuZ2VzID0gZmFsc2UpIHtcbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGxldCBwb3MgPSAwO1xuICBjb25zdCBsb29rQmVoaW5kID0gbiA9PiB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIG5dO1xuXG4gIGlmICgvXj0vLnRlc3QoZngpKSB7XG4gICAgY29uc3QgdG9rZW4gPSB7XG4gICAgICB0eXBlOiBGWF9QUkVGSVgsXG4gICAgICB2YWx1ZTogJz0nLFxuICAgICAgLi4uKGVtaXRSYW5nZXMgPyB7IHJhbmdlOiBbIDAsIDEgXSB9IDoge30pXG4gICAgfTtcbiAgICBwb3MrKztcbiAgICB0b2tlbnMucHVzaCh0b2tlbik7XG4gIH1cblxuICB3aGlsZSAocG9zIDwgZngubGVuZ3RoKSB7XG4gICAgY29uc3Qgc3RhcnRQb3MgPSBwb3M7XG4gICAgY29uc3QgcyA9IGZ4LnNsaWNlKHBvcyk7XG4gICAgbGV0IHRva2VuVHlwZSA9ICcnO1xuICAgIGxldCB0b2tlblZhbHVlID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbIHR5cGUsIHJlVGVzdCwgZm5UZXN0IF0gPSB0b2tlbkhhbmRsZXJzW2ldO1xuICAgICAgY29uc3QgbSA9IHJlVGVzdC5leGVjKHMpO1xuICAgICAgaWYgKG0gJiYgKCFmblRlc3QgfHwgZm5UZXN0KG1bMF0pKSkge1xuICAgICAgICB0b2tlblR5cGUgPSB0eXBlO1xuICAgICAgICB0b2tlblZhbHVlID0gbVswXTtcbiAgICAgICAgcG9zICs9IG1bMF0ubGVuZ3RoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRva2VuVHlwZSkge1xuICAgICAgdG9rZW5UeXBlID0gVU5LTk9XTjtcbiAgICAgIHRva2VuVmFsdWUgPSBmeFtwb3NdO1xuICAgICAgcG9zKys7XG4gICAgfVxuXG4gICAgbGV0IHRva2VuID0ge1xuICAgICAgdHlwZTogdG9rZW5UeXBlLFxuICAgICAgdmFsdWU6IHRva2VuVmFsdWUsXG4gICAgICAuLi4oZW1pdFJhbmdlcyA/IHsgcmFuZ2U6IFsgc3RhcnRQb3MsIHBvcyBdIH0gOiB7fSlcbiAgICB9O1xuXG4gICAgaWYgKG1lcmdlUmFuZ2VzKSB7XG4gICAgICBpZiAodG9rZW5UeXBlID09PSBSQU5HRSB8fCB0b2tlblR5cGUgPT09IFJBTkdFX05BTUVEIHx8IHRva2VuVHlwZSA9PT0gUkFOR0VfQkVBTSkge1xuICAgICAgICBjb25zdCBtZXJnZSA9IFtdO1xuICAgICAgICAvLyBqb2luIEExOkExIG9yIFJDOlJDLVxuICAgICAgICBpZiAoaXNSYW5nZU9wKGxvb2tCZWhpbmQoMSkpICYmIGlzVHlwZShsb29rQmVoaW5kKDIpLCBSQU5HRSkgJiYgdG9rZW5UeXBlID09PSBSQU5HRSkge1xuICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgZG9uZSB0aGlzIGlmIGN1cnJlbnQgb3IgbGFzdCByYW5nZXMgYXJlIEE6QSBvciAxOjEsIG9yIFIgb3IgQylcbiAgICAgICAgICBtZXJnZS51bnNoaWZ0KC4uLnRva2Vucy5zcGxpY2UoLTIsIDIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBqb2luIHByZWZpeGVzXG4gICAgICAgIGlmIChpc0JhbmdPcChsb29rQmVoaW5kKDEpKSkge1xuICAgICAgICAgIGlmIChpc1R5cGUobG9va0JlaGluZCgyKSwgUEFUSF9RVU9URSkgfHwgaXNUeXBlKGxvb2tCZWhpbmQoMiksIFBBVEhfQlJBQ0UpKSB7XG4gICAgICAgICAgICBtZXJnZS51bnNoaWZ0KC4uLnRva2Vucy5zcGxpY2UoLTIsIDIpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNUeXBlKGxvb2tCZWhpbmQoMiksIFBBVEhfUFJFRklYKSkge1xuICAgICAgICAgICAgY29uc3QgbiA9IGlzVHlwZShsb29rQmVoaW5kKDMpLCBQQVRIX0JSQUNFKSA/IDMgOiAyO1xuICAgICAgICAgICAgbWVyZ2UudW5zaGlmdCguLi50b2tlbnMuc3BsaWNlKC1uLCBuKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdhbnQgdG8gbWVyZ2U/XG4gICAgICAgIGlmIChtZXJnZS5sZW5ndGgpIHtcbiAgICAgICAgICB0b2tlbiA9IHtcbiAgICAgICAgICAgIHR5cGU6IHRva2VuVHlwZSxcbiAgICAgICAgICAgIHZhbHVlOiBtZXJnZS5tYXAoZCA9PiBkLnZhbHVlKS5qb2luKCcnKSArIHRva2VuVmFsdWUsXG4gICAgICAgICAgICAuLi4oZW1pdFJhbmdlcyA/IHsgcmFuZ2U6IFsgbWVyZ2VbMF0ucmFuZ2VbMF0sIHBvcyBdIH0gOiB7fSlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbnM7XG59XG5cbi8vIEZvcm11bGFzIGNhbiBlaXRoZXIgaGF2ZSBSQyBvciBBMSBzdHlsZSByZWZzLCBub3QgYm90aDogYmVjYXVzZSBDMSBhbmQgUjEgYXJlIGJvdGghXG4vLyBSZWZtb2RlOiBBMSB8IFJDIHwgQW5vc3RpYyBlbWl0IHJhbmdlcyB3aXRoIFJBTkdFXG5leHBvcnQgZnVuY3Rpb24gdG9rZW5pemUgKGZ4LCB7IGVtaXRSYW5nZXMgPSBmYWxzZSwgbWVyZ2VSYW5nZXMgPSB0cnVlLCByMWMxID0gZmFsc2UgfSA9IHt9KSB7XG4gIGNvbnN0IHRva2VuSGFuZGxlcnMgPSByMWMxID8gdG9rZW5IYW5kbGVyc1JDIDogdG9rZW5IYW5kbGVyc0ExO1xuICByZXR1cm4gZ2V0VG9rZW5zKGZ4LCB0b2tlbkhhbmRsZXJzLCBlbWl0UmFuZ2VzLCBtZXJnZVJhbmdlcyk7XG59XG4iLCJpbXBvcnQgeyBGWF9QUkVGSVgsIFBBVEhfQlJBQ0UsIFBBVEhfUFJFRklYLCBQQVRIX1FVT1RFLCBSQU5HRSwgUkFOR0VfTkFNRUQsIFJBTkdFX0JFQU0gfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRUb2tlbnMgfSBmcm9tICcuL2xleGVyLmpzJztcblxuY29uc3QgdW5xdW90ZSA9IGQgPT4gZC5zbGljZSgxLCAtMSkucmVwbGFjZSgvJycvZywgXCInXCIpO1xuXG5jb25zdCBwUmFuZ2VPcCA9IHQgPT4gdCAmJiB0LnZhbHVlID09PSAnOicgJiYge307XG5jb25zdCBwUmFuZ2UgPSB0ID0+IHQgJiYgdC50eXBlID09PSBSQU5HRSAmJiB7IHIwOiB0LnZhbHVlIH07XG5jb25zdCBwUmFuZ2UyID0gdCA9PiB0ICYmIHQudHlwZSA9PT0gUkFOR0UgJiYgeyByMTogdC52YWx1ZSB9O1xuY29uc3QgcEJhbmcgPSB0ID0+IHQgJiYgdC52YWx1ZSA9PT0gJyEnICYmIHt9O1xuY29uc3QgcEJlYW0gPSB0ID0+IHQgJiYgdC50eXBlID09PSBSQU5HRV9CRUFNICYmIHsgcjA6IHQudmFsdWUgfTtcbmNvbnN0IHBTaGVldCA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFBBVEhfUFJFRklYICYmIC9eW146XFxcXC8/KltcXF1dezAsMzF9JC8udGVzdCh0LnZhbHVlKSAmJiB7IHNoZWV0TmFtZTogdC52YWx1ZSB9O1xuY29uc3QgcEZpbGUgPSB0ID0+IHQgJiYgdC50eXBlID09PSBQQVRIX0JSQUNFICYmIHsgd29ya2Jvb2tOYW1lOiB0LnZhbHVlLnNsaWNlKDEsIC0xKSB9O1xuY29uc3QgcEZpbGUyID0gdCA9PiB0ICYmIHQudHlwZSA9PT0gUEFUSF9QUkVGSVggJiYgeyB3b3JrYm9va05hbWU6IHQudmFsdWUgfTtcbmNvbnN0IHBOYW1lZCA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFJBTkdFX05BTUVEICYmIHsgbmFtZTogdC52YWx1ZSB9O1xuXG5jb25zdCBwUXVvdGVkID0gdCA9PiB7XG4gIGlmICh0ICYmIHQudHlwZSA9PT0gUEFUSF9RVU9URSkge1xuICAgIGNvbnN0IG0gPSAvKD86XFxbKC4rPylcXF0pPyhbXltcXF1dKz8pJC8uZXhlYyh1bnF1b3RlKHQudmFsdWUpKTtcbiAgICBpZiAobSkge1xuICAgICAgY29uc3QgWyAsIGZpbGUsIHNoZWV0IF0gPSBtO1xuICAgICAgaWYgKCFzaGVldCB8fCAvXlteOlxcXFwvPypbXFxdXXswLDMxfSQvLnRlc3Qoc2hlZXQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd29ya2Jvb2tOYW1lOiBmaWxlIHx8ICcnLFxuICAgICAgICAgIHNoZWV0TmFtZTogc2hlZXQgfHwgJydcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5jb25zdCBwUXVvdGVkMiA9IHQgPT4gdCAmJiB0LnR5cGUgPT09IFBBVEhfUVVPVEUgJiYgeyB3b3JrYm9va05hbWU6IHVucXVvdGUodC52YWx1ZSkgfTtcblxuY29uc3QgdmFsaWRSdW5zID0gW1xuICBbIHBSYW5nZSBdLFxuICBbIHBSYW5nZSwgcFJhbmdlT3AsIHBSYW5nZTIgXSxcbiAgWyBwQmVhbSBdLFxuICBbIHBRdW90ZWQsIHBCYW5nLCBwUmFuZ2UgXSxcbiAgWyBwUXVvdGVkLCBwQmFuZywgcFJhbmdlLCBwUmFuZ2VPcCwgcFJhbmdlMiBdLFxuICBbIHBRdW90ZWQsIHBCYW5nLCBwQmVhbSBdLFxuICBbIHBTaGVldCwgcEJhbmcsIHBSYW5nZSBdLFxuICBbIHBTaGVldCwgcEJhbmcsIHBSYW5nZSwgcFJhbmdlT3AsIHBSYW5nZTIgXSxcbiAgWyBwU2hlZXQsIHBCYW5nLCBwQmVhbSBdLFxuICBbIHBGaWxlLCBwU2hlZXQsIHBCYW5nLCBwUmFuZ2UgXSxcbiAgWyBwRmlsZSwgcFNoZWV0LCBwQmFuZywgcFJhbmdlLCBwUmFuZ2VPcCwgcFJhbmdlMiBdLFxuICBbIHBGaWxlLCBwU2hlZXQsIHBCYW5nLCBwQmVhbSBdXG5dO1xuXG5jb25zdCB2YWxpZFJ1bnNOYW1lZCA9IHZhbGlkUnVucy5jb25jYXQoW1xuICBbIHBOYW1lZCBdLFxuICBbIHBGaWxlMiwgcEJhbmcsIHBOYW1lZCBdLFxuICBbIHBRdW90ZWQyLCBwQmFuZywgcE5hbWVkIF1cbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWYgKHJlZiwgYWxsb3dfbmFtZWQgPSB0cnVlLCB0b2tlbkhhbmRsZXJzID0gW10pIHtcbiAgY29uc3QgdG9rZW5zID0gZ2V0VG9rZW5zKHJlZiwgdG9rZW5IYW5kbGVycywgZmFsc2UsIGZhbHNlKTtcbiAgY29uc3QgcmVmRGF0YSA9IHtcbiAgICBzaGVldE5hbWU6ICcnLFxuICAgIHdvcmtib29rTmFtZTogJycsXG4gICAgcjA6ICcnLFxuICAgIHIxOiAnJyxcbiAgICBuYW1lOiAnJ1xuICB9O1xuICAvLyBkaXNjYXJkIHRoZSBcIj1cIi1wcmVmaXggaWYgaXQgaXMgdGhlcmVcbiAgaWYgKHRva2Vucy5sZW5ndGggJiYgdG9rZW5zWzBdLnR5cGUgPT09IEZYX1BSRUZJWCkge1xuICAgIHRva2Vucy5zaGlmdCgpO1xuICB9XG4gIGNvbnN0IHJ1bnMgPSBhbGxvd19uYW1lZCA/IHZhbGlkUnVuc05hbWVkIDogdmFsaWRSdW5zO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkYXRhID0geyAuLi5yZWZEYXRhIH07XG4gICAgaWYgKHJ1bnNbaV0ubGVuZ3RoID09PSB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWxpZCA9IHJ1bnNbaV0uZXZlcnkoKHBhcnNlLCBqKSA9PiB7XG4gICAgICAgIGNvbnN0IGQgPSBwYXJzZSh0b2tlbnNbal0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIGQpO1xuICAgICAgICByZXR1cm4gZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbiIsImltcG9ydCB7IE1BWF9ST1dTLCBNQVhfQ09MUywgdG9rZW5IYW5kbGVyc1JlZnNBMSB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmIH0gZnJvbSAnLi9wYXJzZVJlZi5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQ29sIChjb2xTdHIpIHtcbiAgY29uc3QgYyA9IChjb2xTdHIgfHwgJycpLnRvVXBwZXJDYXNlKCk7XG4gIGxldCBkID0gMDtcbiAgbGV0IGkgPSAwO1xuICBmb3IgKDsgaSAhPT0gYy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNociA9IGMuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY2hyID49IDY1ICYmIGNociA8PSA5MCkgeyAvLyBvbWl0cyBhbnkgbm9uIEEtWiBjaGFyYWN0ZXJcbiAgICAgIGQgPSAyNiAqIGQgKyBjaHIgLSA2NDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGQgLSAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Db2wgKGxlZnQpIHtcbiAgbGV0IG4gPSBsZWZ0O1xuICBsZXQgYyA9ICcnO1xuICB3aGlsZSAobiA+PSAwKSB7XG4gICAgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUobiAlIDI2ICsgNjUpICsgYztcbiAgICBuID0gTWF0aC5mbG9vcihuIC8gMjYpIC0gMTtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3cgKHJvd1N0cikge1xuICByZXR1cm4gK3Jvd1N0ciAtIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JvdyAodG9wKSB7XG4gIHJldHVybiBTdHJpbmcodG9wICsgMSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JlbGF0aXZlIChyYW5nZSkge1xuICBjb25zdCB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCB9ID0gcmFuZ2U7XG4gIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJGxlZnQ6IGZhbHNlLCAkcmlnaHQ6IGZhbHNlLCAkdG9wOiBmYWxzZSwgJGJvdHRvbTogZmFsc2UgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvQWJzb2x1dGUgKHJhbmdlKSB7XG4gIGNvbnN0IHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0gPSByYW5nZTtcbiAgcmV0dXJuIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkbGVmdDogdHJ1ZSwgJHJpZ2h0OiB0cnVlLCAkdG9wOiB0cnVlLCAkYm90dG9tOiB0cnVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0ExIChyYW5nZSkge1xuICBjb25zdCB0b0FicyA9IGQgPT4gKGQgPyAnJCcgOiAnJyk7XG4gIGNvbnN0IHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCAkbGVmdCwgJHJpZ2h0LCAkdG9wLCAkYm90dG9tIH0gPSByYW5nZTtcbiAgLy8gQTpBXG4gIGlmICh0b3AgPT09IDAgJiYgYm90dG9tID09PSBNQVhfUk9XUykge1xuICAgIHJldHVybiB0b0FicygkbGVmdCkgKyB0b0NvbChsZWZ0KSArICc6JyArIHRvQWJzKCRyaWdodCkgKyB0b0NvbChyaWdodCk7XG4gIH1cbiAgLy8gMToxXG4gIGlmIChsZWZ0ID09PSAwICYmIHJpZ2h0ID09PSBNQVhfQ09MUykge1xuICAgIHJldHVybiB0b0FicygkdG9wKSArIHRvUm93KHRvcCkgKyAnOicgKyB0b0FicygkYm90dG9tKSArIHRvUm93KGJvdHRvbSk7XG4gIH1cbiAgLy8gQTE6QTFcbiAgaWYgKHJpZ2h0ICE9IG51bGwgJiYgYm90dG9tICE9IG51bGwgJiYgKHJpZ2h0ICE9PSBsZWZ0IHx8IGJvdHRvbSAhPT0gdG9wKSkge1xuICAgIHJldHVybiB0b0FicygkbGVmdCkgKyB0b0NvbChsZWZ0KSArIHRvQWJzKCR0b3ApICsgdG9Sb3codG9wKSArICc6JyArIHRvQWJzKCRyaWdodCkgKyB0b0NvbChyaWdodCkgKyB0b0FicygkYm90dG9tKSArIHRvUm93KGJvdHRvbSk7XG4gIH1cbiAgLy8gQTFcbiAgcmV0dXJuIHRvQWJzKCRsZWZ0KSArIHRvQ29sKGxlZnQpICsgdG9BYnMoJHRvcCkgKyB0b1Jvdyh0b3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUExIChyYW5nZVN0cikge1xuICBsZXQgbTtcbiAgbGV0IHRvcCA9IDA7XG4gIGxldCBsZWZ0ID0gMDtcbiAgbGV0IGJvdHRvbSA9IE1BWF9ST1dTO1xuICBsZXQgcmlnaHQgPSBNQVhfQ09MUztcbiAgbGV0ICR0b3AgPSBmYWxzZTtcbiAgbGV0ICRsZWZ0ID0gZmFsc2U7XG4gIGxldCAkYm90dG9tID0gZmFsc2U7XG4gIGxldCAkcmlnaHQgPSBmYWxzZTtcbiAgLy8gQTpBXG4gIGlmICgobSA9IC9eKFxcJD8pKFtBLVpdezEsM30pOihcXCQ/KShbQS1aXXsxLDN9KSQvLmV4ZWMocmFuZ2VTdHIpKSkge1xuICAgIGNvbnN0IGEgPSBmcm9tQ29sKG1bMl0pO1xuICAgIGNvbnN0IGIgPSBmcm9tQ29sKG1bNF0pO1xuICAgIGxlZnQgPSBNYXRoLm1pbihhLCBiKTtcbiAgICByaWdodCA9IE1hdGgubWF4KGEsIGIpO1xuICAgICRsZWZ0ID0gISFtW2EgPD0gYiA/IDEgOiAzXTtcbiAgICAkcmlnaHQgPSAhIW1bYSA8PSBiID8gMyA6IDFdO1xuICAgICR0b3AgPSB0cnVlO1xuICAgICRib3R0b20gPSB0cnVlO1xuICAgIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJHRvcCwgJGxlZnQsICRib3R0b20sICRyaWdodCB9O1xuICB9XG4gIC8vIDE6MVxuICBlbHNlIGlmICgobSA9IC9eKFxcJD8pKFsxLTldXFxkezAsNn0pOihcXCQ/KShbMS05XVxcZHswLDZ9KSQvLmV4ZWMocmFuZ2VTdHIpKSkge1xuICAgIGNvbnN0IGEgPSBmcm9tUm93KG1bMl0pO1xuICAgIGNvbnN0IGIgPSBmcm9tUm93KG1bNF0pO1xuICAgIHRvcCA9IE1hdGgubWluKGEsIGIpO1xuICAgIGJvdHRvbSA9IE1hdGgubWF4KGEsIGIpO1xuICAgICR0b3AgPSAhIW1bYSA8PSBiID8gMSA6IDNdO1xuICAgICRib3R0b20gPSAhIW1bYSA8PSBiID8gMyA6IDFdO1xuICAgICRsZWZ0ID0gdHJ1ZTtcbiAgICAkcmlnaHQgPSB0cnVlO1xuICAgIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJHRvcCwgJGxlZnQsICRib3R0b20sICRyaWdodCB9O1xuICB9XG4gIC8vIEExIHwgQTE6QjJcbiAgZWxzZSB7XG4gICAgY29uc3QgWyBwYXJ0MSwgcGFydDIgXSA9IHJhbmdlU3RyLnNwbGl0KCc6Jyk7XG4gICAgaWYgKChtID0gL14oXFwkPykoW0EtWl17MSwzfSkoXFwkPykoWzEtOV1cXGR7MCw2fSkkL2kuZXhlYyhwYXJ0MSkpKSB7XG4gICAgICBsZWZ0ID0gZnJvbUNvbChtWzJdKTtcbiAgICAgIHRvcCA9IGZyb21Sb3cobVs0XSk7XG4gICAgICAkbGVmdCA9ICEhbVsxXTtcbiAgICAgICR0b3AgPSAhIW1bM107XG4gICAgICBpZiAocGFydDIgJiYgKG0gPSAvXihcXCQ/KShbQS1aXXsxLDN9KShcXCQ/KShbMS05XVxcZHswLDZ9KSQvaS5leGVjKHBhcnQyKSkpIHtcbiAgICAgICAgcmlnaHQgPSBmcm9tQ29sKG1bMl0pO1xuICAgICAgICBib3R0b20gPSBmcm9tUm93KG1bNF0pO1xuICAgICAgICAkcmlnaHQgPSAhIW1bMV07XG4gICAgICAgICRib3R0b20gPSAhIW1bM107XG4gICAgICAgIC8vIG5lZWQgdG8gZmxpcD9cbiAgICAgICAgaWYgKGJvdHRvbSA8IHRvcCkge1xuICAgICAgICAgIFsgdG9wLCBib3R0b20sICR0b3AsICRib3R0b20gXSA9IFsgYm90dG9tLCB0b3AsICRib3R0b20sICR0b3AgXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmlnaHQgPCBsZWZ0KSB7XG4gICAgICAgICAgWyBsZWZ0LCByaWdodCwgJGxlZnQsICRyaWdodCBdID0gWyByaWdodCwgbGVmdCwgJHJpZ2h0LCAkbGVmdCBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgYm90dG9tID0gdG9wO1xuICAgICAgICByaWdodCA9IGxlZnQ7XG4gICAgICAgICRib3R0b20gPSAkdG9wO1xuICAgICAgICAkcmlnaHQgPSAkbGVmdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgJHRvcCwgJGxlZnQsICRib3R0b20sICRyaWdodCB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQTFSZWYgKHJlZiwgYWxsb3dfbmFtZWQgPSB0cnVlKSB7XG4gIGNvbnN0IGQgPSBwYXJzZVJlZihyZWYsIGFsbG93X25hbWVkLCB0b2tlbkhhbmRsZXJzUmVmc0ExKTtcbiAgaWYgKGQgJiYgKGQucjAgfHwgZC5uYW1lKSkge1xuICAgIGxldCByYW5nZSA9IG51bGw7XG4gICAgaWYgKGQucjApIHtcbiAgICAgIHJhbmdlID0gZC5yMSA/IGZyb21BMShkLnIwICsgJzonICsgZC5yMSkgOiBmcm9tQTEoZC5yMCk7XG4gICAgfVxuICAgIGlmIChkLm5hbWUgfHwgcmFuZ2UpIHtcbiAgICAgIGQucmFuZ2UgPSByYW5nZTtcbiAgICAgIGRlbGV0ZSBkLnIwO1xuICAgICAgZGVsZXRlIGQucjE7XG4gICAgICByZXR1cm4gZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZnJvbUNvbCxcbiAgdG9Db2wsXG4gIHRvUmVsYXRpdmUsXG4gIHRvQWJzb2x1dGUsXG4gIHRvOiB0b0ExLFxuICBmcm9tOiBmcm9tQTEsXG4gIHBhcnNlOiBwYXJzZUExUmVmXG59O1xuIiwiaW1wb3J0IHsgUkFOR0UsIFJBTkdFX0JFQU0sIFVOS05PV04gfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBwYXJzZUExUmVmLCB0b1JlbGF0aXZlLCB0b0ExIH0gZnJvbSAnLi9hMS5qcyc7XG5cbmZ1bmN0aW9uIGdldElEZXIgKCkge1xuICBsZXQgaSA9IDE7XG4gIHJldHVybiAoKSA9PiAnZnhnJyArIChpKyspO1xufVxuXG4vLyB3aGVuIGNvbnRleHQgaXMgU2hlZXQxLCB3ZSBzaG91bGQgY29uc2lkZXIgU2hlZXQhQTEgPT0gQTFcbmV4cG9ydCBmdW5jdGlvbiBhZGRNZXRhICh0b2tlbnMsIHsgc2hlZXROYW1lID0gJycsIHdvcmtib29rTmFtZSA9ICcnIH0gPSB7fSkge1xuICBjb25zdCBwYXJlblN0YWNrID0gW107XG4gIGxldCBhcnJheVN0YXJ0ID0gbnVsbDtcbiAgY29uc3QgYTFNYXAgPSB7fTtcbiAgY29uc3QgdWlkID0gZ2V0SURlcigpO1xuXG4gIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcbiAgICBpZiAodG9rZW4udmFsdWUgPT09ICcoJykge1xuICAgICAgdG9rZW4uZGVwdGggPSBwYXJlblN0YWNrLmxlbmd0aDtcbiAgICAgIHBhcmVuU3RhY2sucHVzaCh0b2tlbik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnKScpIHtcbiAgICAgIGNvbnN0IGNvdW50ZXIgPSBwYXJlblN0YWNrLnBvcCgpO1xuICAgICAgaWYgKGNvdW50ZXIpIHtcbiAgICAgICAgY29uc3QgcGFpcklkID0gdWlkKCk7XG4gICAgICAgIHRva2VuLmdyb3VwSWQgPSBwYWlySWQ7XG4gICAgICAgIHRva2VuLmRlcHRoID0gY291bnRlci5kZXB0aDtcbiAgICAgICAgY291bnRlci5ncm91cElkID0gcGFpcklkO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRva2VuLmVycm9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICd7Jykge1xuICAgICAgaWYgKCFhcnJheVN0YXJ0KSB7XG4gICAgICAgIGFycmF5U3RhcnQgPSB0b2tlbjtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0b2tlbi5lcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnZhbHVlID09PSAnfScpIHtcbiAgICAgIGlmIChhcnJheVN0YXJ0KSB7XG4gICAgICAgIGNvbnN0IHBhaXJJZCA9IHVpZCgpO1xuICAgICAgICB0b2tlbi5ncm91cElkID0gcGFpcklkO1xuICAgICAgICBhcnJheVN0YXJ0Lmdyb3VwSWQgPSBwYWlySWQ7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdG9rZW4uZXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgICAgYXJyYXlTdGFydCA9IG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFJBTkdFIHx8IHRva2VuLnR5cGUgPT09IFJBTkdFX0JFQU0pIHtcbiAgICAgIGNvbnN0IHJlZiA9IHBhcnNlQTFSZWYodG9rZW4udmFsdWUsIGZhbHNlKTtcbiAgICAgIGNvbnN0IGExID0gcmVmICYmIChgWyR7cmVmLndvcmtib29rTmFtZSB8fCB3b3JrYm9va05hbWV9XSR7cmVmLnNoZWV0TmFtZSB8fCBzaGVldE5hbWV9ISR7cmVmLnJhbmdlID8gdG9BMSh0b1JlbGF0aXZlKHJlZi5yYW5nZSkpIDogcmVmLm5hbWV9YCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChhMSkge1xuICAgICAgICBpZiAoYTEgaW4gYTFNYXApIHtcbiAgICAgICAgICB0b2tlbi5ncm91cElkID0gYTFNYXBbYTFdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRva2VuLmdyb3VwSWQgPSB1aWQoKTtcbiAgICAgICAgICBhMU1hcFthMV0gPSB0b2tlbi5ncm91cElkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09IFVOS05PV04pIHtcbiAgICAgIHRva2VuLmVycm9yID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdG9rZW5zO1xufVxuIiwiLypcbiAgUkMgbm90YXRpb24gd29ya3MgZGlmZmVyZW50bHkgZnJvbSBBMSBpbiB0aGF0IHdlIGNhbid0IG1lcmdlIHN0YXRpYyByZWZlcmVuY2VzIGpvaW5lZCBieSBgOmAuXG4gIE1lcmdpbmcgY2FuIG9ubHkgd29yayBiZXR3ZWVuIHJlZmVyZW5jZXMgdGhhdCBhcmUgcmVsYXRpdmUvYWJzb2x1dGUgb24gdGhlIHNhbWUgYXhlcywgc286XG4gIFIxQzE6UjJDMiB3aWxsIHdvcmssIFJbMV1DMTpSWzJdQzIgd2lsbCBhbHNvIHdvcmssIGJ1dCBSWzFdQ1sxXTpSMkMyIGNhbm5vdCBiZSByZXByZXNlbnRlZFxuICBzaW1wbHkgYnkgYSByZWN0YW5nbGUgYXMgd2l0aG91dCBrbm93aW5nIHRoZSBjZWxsIGNvbnRleHQuXG4qL1xuXG5pbXBvcnQgeyBNQVhfUk9XUywgTUFYX0NPTFMsIHRva2VuSGFuZGxlcnNSZWZzUkMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZiB9IGZyb20gJy4vcGFyc2VSZWYuanMnO1xuXG5mdW5jdGlvbiB0b0Nvb3JkICh2YWx1ZSwgaXNBYnMpIHtcbiAgaWYgKGlzQWJzKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSArIDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZSA/ICdbJyArIHZhbHVlICsgJ10nIDogJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JDIChyYW5nZSkge1xuICBjb25zdCB7IHIwLCBjMCwgcjEsIGMxLCAkYzAsICRjMSwgJHIwLCAkcjEgfSA9IHJhbmdlO1xuICAvLyBDOkNcbiAgaWYgKHIwID09PSAwICYmIHIxID09PSBNQVhfUk9XUykge1xuICAgIGNvbnN0IGEgPSB0b0Nvb3JkKGMwLCAkYzApO1xuICAgIGNvbnN0IGIgPSB0b0Nvb3JkKGMxLCAkYzEpO1xuICAgIHJldHVybiAnQycgKyAoYSA9PT0gYiA/IGEgOiBhICsgJzpDJyArIGIpO1xuICB9XG4gIC8vIFI6UlxuICBpZiAoYzAgPT09IDAgJiYgYzEgPT09IE1BWF9DT0xTKSB7XG4gICAgY29uc3QgYSA9IHRvQ29vcmQocjAsICRyMCk7XG4gICAgY29uc3QgYiA9IHRvQ29vcmQocjEsICRyMSk7XG4gICAgcmV0dXJuICdSJyArIChhID09PSBiID8gYSA6IGEgKyAnOlInICsgYik7XG4gIH1cbiAgLy8gUkM6UkNcbiAgY29uc3Qgc19yMCA9IHRvQ29vcmQocjAsICRyMCk7XG4gIGNvbnN0IHNfcjEgPSB0b0Nvb3JkKHIxLCAkcjEpO1xuICBjb25zdCBzX2MwID0gdG9Db29yZChjMCwgJGMwKTtcbiAgY29uc3Qgc19jMSA9IHRvQ29vcmQoYzEsICRjMSk7XG4gIGlmIChzX3IwICE9PSBzX3IxIHx8IHNfYzAgIT09IHNfYzEpIHtcbiAgICByZXR1cm4gJ1InICsgc19yMCArICdDJyArIHNfYzAgKyAnOlInICsgc19yMSArICdDJyArIHNfYzE7XG4gIH1cbiAgLy8gUkNcbiAgcmV0dXJuICdSJyArIHNfcjAgKyAnQycgKyBzX2MwO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJDUGFydCAocmVmKSB7XG4gIGxldCByMCA9IDA7XG4gIGxldCBjMCA9IDA7XG4gIGxldCByMSA9IE1BWF9ST1dTO1xuICBsZXQgYzEgPSBNQVhfQ09MUztcbiAgbGV0ICRyMCA9IGZhbHNlO1xuICBsZXQgJGMwID0gZmFsc2U7XG4gIGxldCAkcjEgPSBmYWxzZTtcbiAgbGV0ICRjMSA9IGZhbHNlO1xuICAvLyBSIHBhcnRcbiAgY29uc3Qgcm0gPSAvXlIoPzpcXFsoWystXT9cXGQrKVxcXXwoXFxkKykpPy8uZXhlYyhyZWYpO1xuICBpZiAocm0pIHtcbiAgICBpZiAocm1bMV0pIHtcbiAgICAgIHIwID0gcGFyc2VJbnQocm1bMV0sIDEwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocm1bMl0pIHtcbiAgICAgIHIwID0gcGFyc2VJbnQocm1bMl0sIDEwKSAtIDE7XG4gICAgICAkcjAgPSB0cnVlO1xuICAgIH1cbiAgICByMSA9IHIwO1xuICAgICRyMSA9ICRyMDtcbiAgICByZWYgPSByZWYuc2xpY2Uocm1bMF0ubGVuZ3RoKTtcbiAgfVxuICBlbHNlIHtcbiAgICAvLyByMCA9IDAsIHIxID0gTUFYX1JPV1NcbiAgICAkcjAgPSB0cnVlO1xuICAgICRyMSA9IHRydWU7XG4gIH1cbiAgLy8gQyBwYXJ0XG4gIGNvbnN0IGNtID0gL15DKD86XFxbKFsrLV0/XFxkKylcXF18KFxcZCspKT8vLmV4ZWMocmVmKTtcbiAgaWYgKGNtKSB7XG4gICAgaWYgKGNtWzFdKSB7XG4gICAgICBjMCA9IHBhcnNlSW50KGNtWzFdLCAxMCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNtWzJdKSB7XG4gICAgICBjMCA9IHBhcnNlSW50KGNtWzJdLCAxMCkgLSAxO1xuICAgICAgJGMwID0gdHJ1ZTtcbiAgICB9XG4gICAgYzEgPSBjMDtcbiAgICAkYzEgPSAkYzA7XG4gICAgcmVmID0gcmVmLnNsaWNlKGNtWzBdLmxlbmd0aCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gYzAgPSAwLCBjMSA9IE1BWF9DT0xTXG4gICAgJGMwID0gdHJ1ZTtcbiAgICAkYzEgPSB0cnVlO1xuICB9XG4gIC8vIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcGFydCAoYW5kIG5vdGhpbmcgbW9yZSlcbiAgaWYgKCghcm0gJiYgIWNtKSB8fCByZWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHsgcjAsIGMwLCByMSwgYzEsICRyMCwgJGMwLCAkcjEsICRjMSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJDIChyZWYpIHtcbiAgY29uc3QgWyBwYXJ0MSwgcGFydDIgXSA9IHJlZi5zcGxpdCgnOicsIDIpO1xuICBjb25zdCByYW5nZSA9IHBhcnNlUkNQYXJ0KHBhcnQxKTtcbiAgaWYgKCFyYW5nZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChyYW5nZSAmJiBwYXJ0Mikge1xuICAgIGNvbnN0IGV4dGVuZFRvID0gcGFyc2VSQ1BhcnQocGFydDIpO1xuICAgIGlmIChleHRlbmRUbykge1xuICAgICAgLy8gTm90ZTogUlstMV1DWy0xXTpSMUMxIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbmNlIHdlIGhhdmUgYW4gYW5jaG9yXG4gICAgICByYW5nZS5yMSA9IGV4dGVuZFRvLnIxO1xuICAgICAgcmFuZ2UuYzEgPSBleHRlbmRUby5jMTtcbiAgICAgIHJhbmdlLiRyMSA9IGV4dGVuZFRvLiRyMTtcbiAgICAgIHJhbmdlLiRjMSA9IGV4dGVuZFRvLiRjMTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJhbmdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSQ1JlZiAocmVmLCBhbGxvd19uYW1lZCA9IHRydWUpIHtcbiAgY29uc3QgZCA9IHBhcnNlUmVmKHJlZiwgYWxsb3dfbmFtZWQsIHRva2VuSGFuZGxlcnNSZWZzUkMpO1xuICBpZiAoZCAmJiAoZC5yMCB8fCBkLm5hbWUpKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkLnIxID8gZnJvbVJDKGQucjAgKyAnOicgKyBkLnIxKSA6IGZyb21SQyhkLnIwKTtcbiAgICBpZiAoZC5uYW1lIHx8IHJhbmdlKSB7XG4gICAgICBkLnJhbmdlID0gcmFuZ2U7XG4gICAgICBkZWxldGUgZC5yMDtcbiAgICAgIGRlbGV0ZSBkLnIxO1xuICAgICAgcmV0dXJuIGQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHRvOiB0b1JDLFxuICBmcm9tOiBmcm9tUkMsXG4gIHBhcnNlOiBwYXJzZVJDUmVmXG59O1xuIiwiaW1wb3J0IHsgUkFOR0UsIFJBTkdFX0JFQU0sIE1BWF9ST1dTLCBNQVhfQ09MUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGZyb21BMSwgdG9BMSB9IGZyb20gJy4vYTEuanMnO1xuaW1wb3J0IHsgZnJvbVJDLCB0b1JDIH0gZnJvbSAnLi9yYy5qcyc7XG5pbXBvcnQgeyB0b2tlbml6ZSB9IGZyb20gJy4vbGV4ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlVG9SQyAoZngsIGFuY2hvckNlbGwpIHtcbiAgY29uc3QgeyB0b3AsIGxlZnQgfSA9IGZyb21BMShhbmNob3JDZWxsKTtcbiAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgZnggPT09ICdzdHJpbmcnO1xuXG4gIGNvbnN0IHRva2VucyA9IGlzU3RyaW5nXG4gICAgPyB0b2tlbml6ZShmeCwgeyBlbWl0UmFuZ2VzOiBmYWxzZSwgbWVyZ2VSYW5nZXM6IGZhbHNlLCByMWMyOiBmYWxzZSB9KVxuICAgIDogZng7XG5cbiAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xuICAgIGlmICh0b2tlbi50eXBlID09PSBSQU5HRSkge1xuICAgICAgY29uc3QgcmFuZ2UgPSB7fTtcbiAgICAgIGNvbnN0IGQgPSBmcm9tQTEodG9rZW4udmFsdWUpO1xuXG4gICAgICByYW5nZS5yMCA9IGQuJHRvcCA/IGQudG9wIDogZC50b3AgLSB0b3A7XG4gICAgICByYW5nZS4kcjAgPSBkLiR0b3A7XG4gICAgICByYW5nZS5yMSA9IGQuJGJvdHRvbSA/IGQuYm90dG9tIDogZC5ib3R0b20gLSB0b3A7XG4gICAgICByYW5nZS4kcjEgPSBkLiRib3R0b207XG5cbiAgICAgIHJhbmdlLmMwID0gZC4kbGVmdCA/IGQubGVmdCA6IGQubGVmdCAtIGxlZnQ7XG4gICAgICByYW5nZS4kYzAgPSBkLiRsZWZ0O1xuICAgICAgcmFuZ2UuYzEgPSBkLiRyaWdodCA/IGQucmlnaHQgOiBkLnJpZ2h0IC0gbGVmdDtcbiAgICAgIHJhbmdlLiRjMSA9IGQuJHJpZ2h0O1xuXG4gICAgICAvLyBjb25zb2xlLmVycm9yKHRva2VuLnZhbHVlLCBkLCByYW5nZSwgWyB0b3AsIGxlZnQgXSk7XG4gICAgICB0b2tlbi52YWx1ZSA9IHRvUkMocmFuZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSBSQU5HRV9CRUFNKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHt9O1xuICAgICAgY29uc3QgZCA9IGZyb21BMSh0b2tlbi52YWx1ZSk7XG5cbiAgICAgIHJhbmdlLnIwID0gZC4kdG9wID8gZC50b3AgOiBkLnRvcCAtIHRvcDtcbiAgICAgIHJhbmdlLiRyMCA9IGQuJHRvcDtcbiAgICAgIHJhbmdlLnIxID0gZC4kYm90dG9tID8gZC5ib3R0b20gOiBkLmJvdHRvbSAtIHRvcDtcbiAgICAgIHJhbmdlLiRyMSA9IGQuJGJvdHRvbTtcblxuICAgICAgcmFuZ2UuYzAgPSBkLiRsZWZ0ID8gZC5sZWZ0IDogZC5sZWZ0IC0gbGVmdDtcbiAgICAgIHJhbmdlLiRjMCA9IGQuJGxlZnQ7XG4gICAgICByYW5nZS5jMSA9IGQuJHJpZ2h0ID8gZC5yaWdodCA6IGQucmlnaHQgLSBsZWZ0O1xuICAgICAgcmFuZ2UuJGMxID0gZC4kcmlnaHQ7XG5cbiAgICAgIHRva2VuLnZhbHVlID0gdG9SQyhyYW5nZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaXNTdHJpbmdcbiAgICA/IHRva2Vucy5tYXAoZCA9PiBkLnZhbHVlKS5qb2luKCcnKVxuICAgIDogdG9rZW5zO1xufVxuXG5mdW5jdGlvbiB0b0ZpeGVkICh2YWwsIGFicywgYmFzZSwgbWF4KSB7XG4gIGxldCB2ID0gdmFsO1xuICBpZiAoIWFicykge1xuICAgIHYgPSBiYXNlICsgdmFsO1xuICAgIC8vIEV4Y2VsIFwid3JhcHMgYXJvdW5kXCIgd2hlbiB2YWx1ZSBnb2VzIG91dCBvZiBsb3dlciBib3VuZHMuXG4gICAgLy8gSXQncyBhIGJpdCBxdWlya3kgb24gZW50cnkgYXMgRXhjZWwgd2FudHMgdG8gcmUtcmV3aXRlIHRoZVxuICAgIC8vIHJlZmVyZW5jZXMgYnV0IGJlaGF2aW91ciBpcyBjb25zaXN0ZW50IHdpdGggSU5ESVJFQ1Q6XG4gICAgLy8gLi4uIEluIEExOiBSQ1stMV0gPT4gUjFDWzE2MzgzXS5cbiAgICBpZiAodiA8IDApIHtcbiAgICAgIHYgPSBtYXggKyB2ICsgMTtcbiAgICB9XG4gICAgLy8gLi4uIEluIEIxOiA9UkNbMTYzODNdID0+ID1SQ1stMV1cbiAgICBpZiAodiA+IG1heCkge1xuICAgICAgdiAtPSBtYXggKyAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZVRvQTEgKGZ4LCBhbmNob3JDZWxsKSB7XG4gIGNvbnN0IGFuY2hvciA9IGZyb21BMShhbmNob3JDZWxsKTtcbiAgY29uc3QgaXNTdHJpbmcgPSB0eXBlb2YgZnggPT09ICdzdHJpbmcnO1xuXG4gIGNvbnN0IHRva2VucyA9IGlzU3RyaW5nXG4gICAgPyB0b2tlbml6ZShmeCwgeyBlbWl0UmFuZ2VzOiBmYWxzZSwgbWVyZ2VSYW5nZXM6IGZhbHNlLCByMWMxOiB0cnVlIH0pXG4gICAgOiBmeDtcblxuICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09IFJBTkdFIHx8IHRva2VuLnR5cGUgPT09IFJBTkdFX0JFQU0pIHtcbiAgICAgIGNvbnN0IHJhbmdlID0ge307XG4gICAgICBjb25zdCBkID0gZnJvbVJDKHRva2VuLnZhbHVlKTtcbiAgICAgIGNvbnN0IHIwID0gdG9GaXhlZChkLnIwLCBkLiRyMCwgYW5jaG9yLnRvcCwgTUFYX1JPV1MpO1xuICAgICAgY29uc3QgcjEgPSB0b0ZpeGVkKGQucjEsIGQuJHIxLCBhbmNob3IudG9wLCBNQVhfUk9XUyk7XG4gICAgICBpZiAocjAgPiByMSkge1xuICAgICAgICByYW5nZS50b3AgPSByMTtcbiAgICAgICAgcmFuZ2UuJHRvcCA9IGQuJHIxO1xuICAgICAgICByYW5nZS5ib3R0b20gPSByMDtcbiAgICAgICAgcmFuZ2UuJGJvdHRvbSA9IGQuJHIwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJhbmdlLnRvcCA9IHIwO1xuICAgICAgICByYW5nZS4kdG9wID0gZC4kcjA7XG4gICAgICAgIHJhbmdlLmJvdHRvbSA9IHIxO1xuICAgICAgICByYW5nZS4kYm90dG9tID0gZC4kcjE7XG4gICAgICB9XG4gICAgICBjb25zdCBjMCA9IHRvRml4ZWQoZC5jMCwgZC4kYzAsIGFuY2hvci5sZWZ0LCBNQVhfQ09MUyk7XG4gICAgICBjb25zdCBjMSA9IHRvRml4ZWQoZC5jMSwgZC4kYzEsIGFuY2hvci5sZWZ0LCBNQVhfQ09MUyk7XG4gICAgICBpZiAoYzAgPiBjMSkge1xuICAgICAgICByYW5nZS5sZWZ0ID0gYzE7XG4gICAgICAgIHJhbmdlLiRsZWZ0ID0gZC4kYzE7XG4gICAgICAgIHJhbmdlLnJpZ2h0ID0gYzA7XG4gICAgICAgIHJhbmdlLiRyaWdodCA9IGQuJGMwO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJhbmdlLmxlZnQgPSBjMDtcbiAgICAgICAgcmFuZ2UuJGxlZnQgPSBkLiRjMDtcbiAgICAgICAgcmFuZ2UucmlnaHQgPSBjMTtcbiAgICAgICAgcmFuZ2UuJHJpZ2h0ID0gZC4kYzE7XG4gICAgICB9XG4gICAgICB0b2tlbi52YWx1ZSA9IHRvQTEocmFuZ2UpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGlzU3RyaW5nXG4gICAgPyB0b2tlbnMubWFwKGQgPT4gZC52YWx1ZSkuam9pbignJylcbiAgICA6IHRva2Vucztcbn1cbiIsImV4cG9ydCB7IHRva2VuaXplIH0gZnJvbSAnLi9sZXhlci5qcyc7XG5leHBvcnQgeyBhZGRNZXRhIH0gZnJvbSAnLi9hZGRNZXRhLmpzJztcbmV4cG9ydCB7IHRyYW5zbGF0ZVRvUkMsIHRyYW5zbGF0ZVRvQTEgfSBmcm9tICcuL3RyYW5zbGF0ZS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGExIH0gZnJvbSAnLi9hMS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHJjIH0gZnJvbSAnLi9yYy5qcyc7XG5leHBvcnQgeyBNQVhfQ09MUywgTUFYX1JPV1MgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5cbmltcG9ydCB7XG4gIE9QRVJBVE9SLFxuICBCT09MRUFOLFxuICBFUlJPUixcbiAgTlVNQkVSLFxuICBGVU5DVElPTixcbiAgTkVXTElORSxcbiAgV0hJVEVTUEFDRSxcbiAgU1RSSU5HLFxuICBQQVRIX1FVT1RFLFxuICBQQVRIX0JSQUNFLFxuICBQQVRIX1BSRUZJWCxcbiAgUkFOR0UsXG4gIFJBTkdFX0JFQU0sXG4gIFJBTkdFX05BTUVELFxuICBGWF9QUkVGSVgsXG4gIFVOS05PV05cbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5leHBvcnQgY29uc3QgdG9rZW5UeXBlcyA9IHtcbiAgT1BFUkFUT1IsXG4gIEJPT0xFQU4sXG4gIEVSUk9SLFxuICBOVU1CRVIsXG4gIEZVTkNUSU9OLFxuICBORVdMSU5FLFxuICBXSElURVNQQUNFLFxuICBTVFJJTkcsXG4gIFBBVEhfUVVPVEUsXG4gIFBBVEhfQlJBQ0UsXG4gIFBBVEhfUFJFRklYLFxuICBSQU5HRSxcbiAgUkFOR0VfQkVBTSxcbiAgUkFOR0VfTkFNRUQsXG4gIEZYX1BSRUZJWCxcbiAgVU5LTk9XTlxufTtcbiJdLCJuYW1lcyI6WyJxdWlja1ZlcmlmeVJhbmdlQTEiLCJ0b2tlblZhbHVlIiwic3BsaXQiLCJldmVyeSIsImQiLCJuIiwicGFyc2VJbnQiLCJpc05hTiIsImlzRmluaXRlIiwiYm91bmRzIiwicXVpY2tWZXJpZnlSYW5nZVJDIiwicmVOdW1zIiwibSIsImV4ZWMiLCJ4IiwidmFsIiwiT1BFUkFUT1IiLCJCT09MRUFOIiwiRVJST1IiLCJOVU1CRVIiLCJGVU5DVElPTiIsIk5FV0xJTkUiLCJXSElURVNQQUNFIiwiU1RSSU5HIiwiUEFUSF9RVU9URSIsIlBBVEhfQlJBQ0UiLCJQQVRIX1BSRUZJWCIsIlJBTkdFIiwiUkFOR0VfQkVBTSIsIlJBTkdFX05BTUVEIiwiRlhfUFJFRklYIiwiVU5LTk9XTiIsIk1BWF9DT0xTIiwiTUFYX1JPV1MiLCJyZV9FUlJPUiIsInJlX09QRVJBVE9SIiwicmVfQk9PTEVBTiIsInJlX0ZVTkNUSU9OIiwicmVfTkVXTElORSIsInJlX1dISVRFU1BBQ0UiLCJyZV9TVFJJTkciLCJyZV9QQVRIX1FVT1RFIiwicmVfUEFUSF9CUkFDRSIsInJlX1BBVEhfUFJFRklYIiwicmVfQTFDT0wiLCJyZV9BMVJPVyIsInJlX0ExUkFOR0UiLCJyUGFydCIsImNQYXJ0IiwicmVfUkNDT0wiLCJSZWdFeHAiLCJyZV9SQ1JPVyIsInJlX1JDUkFOR0UiLCJyZV9OVU1CRVIiLCJyZV9OQU1FRCIsInRva2VuSGFuZGxlcnNBMSIsInRva2VuSGFuZGxlcnNSQyIsInRva2VuSGFuZGxlcnNSZWZzQTEiLCJ0b2tlbkhhbmRsZXJzUmVmc1JDIiwiaXNUeXBlIiwidCIsInR5cGUiLCJpc1JhbmdlT3AiLCJ2YWx1ZSIsImlzQmFuZ09wIiwiZ2V0VG9rZW5zIiwiZngiLCJ0b2tlbkhhbmRsZXJzIiwiZW1pdFJhbmdlcyIsIm1lcmdlUmFuZ2VzIiwidG9rZW5zIiwicG9zIiwidG9rZW4iLCJsb29rQmVoaW5kIiwibGVuZ3RoIiwidGVzdCIsInJhbmdlIiwicHVzaCIsInN0YXJ0UG9zIiwicyIsInNsaWNlIiwidG9rZW5UeXBlIiwibGV0IiwiaSIsInJlVGVzdCIsImZuVGVzdCIsIm1lcmdlIiwidW5zaGlmdCIsInNwbGljZSIsIm1hcCIsImpvaW4iLCJ0b2tlbml6ZSIsInIxYzEiLCJ1bnF1b3RlIiwicmVwbGFjZSIsInBSYW5nZU9wIiwicFJhbmdlIiwicjAiLCJwUmFuZ2UyIiwicjEiLCJwQmFuZyIsInBCZWFtIiwicFNoZWV0Iiwic2hlZXROYW1lIiwicEZpbGUiLCJ3b3JrYm9va05hbWUiLCJwRmlsZTIiLCJwTmFtZWQiLCJuYW1lIiwicFF1b3RlZCIsImZpbGUiLCJzaGVldCIsInBRdW90ZWQyIiwidmFsaWRSdW5zIiwidmFsaWRSdW5zTmFtZWQiLCJjb25jYXQiLCJwYXJzZVJlZiIsInJlZiIsImFsbG93X25hbWVkIiwicmVmRGF0YSIsInNoaWZ0IiwicnVucyIsImRhdGEiLCJwYXJzZSIsImoiLCJPYmplY3QiLCJhc3NpZ24iLCJmcm9tQ29sIiwiY29sU3RyIiwiYyIsInRvVXBwZXJDYXNlIiwiY2hyIiwiY2hhckNvZGVBdCIsInRvQ29sIiwibGVmdCIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsIk1hdGgiLCJmbG9vciIsImZyb21Sb3ciLCJyb3dTdHIiLCJ0b1JvdyIsInRvcCIsInRvUmVsYXRpdmUiLCJib3R0b20iLCJyaWdodCIsIiRsZWZ0IiwiJHJpZ2h0IiwiJHRvcCIsIiRib3R0b20iLCJ0b0Fic29sdXRlIiwidG9BMSIsInRvQWJzIiwiZnJvbUExIiwicmFuZ2VTdHIiLCJhIiwiYiIsIm1pbiIsIm1heCIsInBhcnQxIiwicGFydDIiLCJwYXJzZUExUmVmIiwidG8iLCJmcm9tIiwiZ2V0SURlciIsImFkZE1ldGEiLCJwYXJlblN0YWNrIiwiYXJyYXlTdGFydCIsImExTWFwIiwidWlkIiwiZm9yRWFjaCIsImRlcHRoIiwiY291bnRlciIsInBvcCIsInBhaXJJZCIsImdyb3VwSWQiLCJlcnJvciIsImExIiwidG9Mb3dlckNhc2UiLCJ0b0Nvb3JkIiwiaXNBYnMiLCJ0b1JDIiwiYzAiLCJjMSIsIiRjMCIsIiRjMSIsIiRyMCIsIiRyMSIsInNfcjAiLCJzX3IxIiwic19jMCIsInNfYzEiLCJwYXJzZVJDUGFydCIsInJtIiwiY20iLCJmcm9tUkMiLCJleHRlbmRUbyIsInBhcnNlUkNSZWYiLCJ0cmFuc2xhdGVUb1JDIiwiYW5jaG9yQ2VsbCIsImlzU3RyaW5nIiwicjFjMiIsInRvRml4ZWQiLCJhYnMiLCJiYXNlIiwidiIsInRyYW5zbGF0ZVRvQTEiLCJhbmNob3IiLCJ0b2tlblR5cGVzIl0sIm1hcHBpbmdzIjoiYUFBTyxTQUFTQSxtQkFBb0JDLFVBTTNCQSxFQUFXQyxNQUFNLG1CQUFt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
1
+ "use strict";function t(t){return t.split(/(\d+|[a-zA-Z]+)/).every((t=>{const e=parseInt(t,36);return!!isNaN(e)||(isFinite(t)?e<=2183880786:e<=43321)}))}const e={R:1048577,"R[":1048576,C:16385,"C[":16384};function r(t){const r=/([RC]\[?)(-?\d+)/gi;let n;for(;null!==(n=r.exec(t));){const t=e[n[1]],r=parseInt(n[2],10);if(r>=t||r<=-t)return!1}return!0}const n="range",o="range-beam",a=/^#(NAME\?|FIELD!|CALC!|VALUE!|REF!|DIV\/0!|NULL!|NUM!|N\/A|GETTING_DATA\b|SPILL!|UNKNOWN!|FIELD\b|CALC\b|SYNTAX\?|ERROR!)/i,i=/^(<=|>=|<>|[-+/*^%&<>=]|[{},;]|[()]|@|:|!|#)/,l=/^(TRUE|FALSE)\b/i,u=/^[A-Z_]+[A-Z\d_.]+(?=\s*\()/i,c=/^\n+/,p=/^[ \f\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,s=/^"(?:""|[^"])*("|$)/,f=/^'(?:''|[^'])*('|$)/,$=/^\[(?:[^\]])+(\]|$)/,h=/^([^ \t\n$!"`'#%&(){}<>,;:^@|~=*+-]+)(?=!)/,g=/^\$?[A-Z]{1,3}:\$?[A-Z]{1,3}/i,m=/^\$?[1-9][0-9]{0,6}:\$?[1-9][0-9]{0,6}/i,b=/^\$?[A-Z]{1,3}\$?[1-9][0-9]{0,6}/i,d="(?:R(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,6})?)",v="(?:C(?:\\[[+-]?\\d+\\]|[1-9][0-9]{0,4})?)",R=new RegExp(`^${v}(:${v})?(?=\\W|$)`,"i"),x=new RegExp(`^${d}(:${d})?(?=\\W|$)`,"i"),N=new RegExp(`^(?:(?=[RC])${d}${v})`,"i"),A=/^(?:\d+(\.\d+)?(?:[eE][+-]?\d+)?|\d+)/,E=/^[A-Z\d\\_.?]+/i,C=[["error",a],["operator",i],["bool",l],["function",u],["newline",c],["whitespace",p],["string",s],["path-quote",f],["path-brace",$],["path-prefix",h],[n,b,t],[o,g,t],[o,m,t],["number",A],["range-named",E]],y=[["error",a],["operator",i],["bool",l],["function",u],["newline",c],["whitespace",p],["string",s],["path-quote",f],["path-brace",$],["path-prefix",h],[n,N,r],[o,x,r],[o,R,r],["number",A],["range-named",E]],I=[["operator",/^[!:]/],["path-quote",f],["path-brace",$],["path-prefix",h],[n,b,t],[o,g,t],[o,m,t],["range-named",E]],w=[["operator",/^!/],["path-quote",f],["path-brace",$],["path-prefix",h],[n,N,r],[o,x,r],[o,R,r],["range-named",E]],k=(t,e)=>t&&t.type===e,T=t=>t&&":"===t.value,L=t=>t&&"!"===t.value,O={emitRanges:!1,mergeRanges:!0,negativeNumbers:!1,r1c1:!1};function M(t,e){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const{emitRanges:a,mergeRanges:i,negativeNumbers:l}=Object.assign({},O,r),u=[];let c=0;const p=t=>u[u.length-t],s=t=>{const e=u.filter((t=>!k(t,"whitespace")&&!k(t,"newline")));return e[e.length-t]};if(/^=/.test(t)){const t={type:"fx-prefix",value:"=",...a?{range:[0,1]}:{}};c++,u.push(t)}for(;c<t.length;){const r=c,f=t.slice(c);let $="",h="";for(let t=0;t<e.length;t++){const[r,n,o]=e[t],a=n.exec(f);if(a&&(!o||o(a[0]))){$=r,h=a[0],c+=a[0].length;break}}$||($="unknown",h=t[c],c++);let g={type:$,value:h,...a?{range:[r,c]}:{}};if(("string"!==$||h.endsWith('"'))&&("path-brace"!==$||h.endsWith("]"))&&("path-quote"!==$||h.endsWith("'"))||(g.unterminated=!0),l&&"number"===$){const t=p(1);if(t&&k(t,"operator")&&"-"===t.value){const t=s(2);(!t||k(t,"fx-prefix")||k(t,"operator")&&!["%","}",")","#"].includes(t.value))&&(u.pop(),g.value="-"+h)}}if(i&&($===n||"range-named"===$||$===o)){const t=[];if(T(p(1))&&k(p(2),n)&&$===n&&t.unshift(...u.splice(-2,2)),L(p(1)))if(k(p(2),"path-quote")||k(p(2),"path-brace"))t.unshift(...u.splice(-2,2));else if(k(p(2),"path-prefix")){const e=k(p(3),"path-brace")?3:2;t.unshift(...u.splice(-e,e))}t.length&&(g={type:$,value:t.map((t=>t.value)).join("")+h,...a?{range:[t[0].range[0],c]}:{}})}u.push(g)}return u}function _(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=e.r1c1?y:C;return M(t,r,e)}const Z=t=>t.slice(1,-1).replace(/''/g,"'"),S=t=>t&&":"===t.value&&{},U=t=>t&&t.type===n&&{r0:t.value},W=t=>t&&t.type===n&&{r1:t.value},q=t=>t&&"!"===t.value&&{},F=t=>t&&t.type===o&&{r0:t.value},P=t=>t&&"path-prefix"===t.type&&/^[^:\\/?*[\]]{0,31}$/.test(t.value)&&{sheetName:t.value},G=t=>t&&"path-brace"===t.type&&{workbookName:t.value.slice(1,-1)},X=t=>t&&"range-named"===t.type&&{name:t.value},j=t=>{if(t&&"path-quote"===t.type){const e=/(?:\[(.+?)\])?([^[\]]+?)$/.exec(Z(t.value));if(e){const[,t,r]=e;if(!r||/^[^:\\/?*[\]]{0,31}$/.test(r))return{workbookName:t||"",sheetName:r||""}}}},D=[[U],[U,S,W],[F],[j,q,U],[j,q,U,S,W],[j,q,F],[P,q,U],[P,q,U,S,W],[P,q,F],[G,P,q,U],[G,P,q,U,S,W],[G,P,q,F]],B=D.concat([[X],[t=>t&&"path-prefix"===t.type&&{workbookName:t.value},q,X],[t=>t&&"path-quote"===t.type&&{workbookName:Z(t.value)},q,X]]);function H(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];const n=M(t,r,{emitRanges:!1,mergeRanges:!1}),o={sheetName:"",workbookName:"",r0:"",r1:"",name:""};n.length&&"fx-prefix"===n[0].type&&n.shift();const a=e?B:D;for(let t=0;t<a.length;t++){const e={...o};if(a[t].length===n.length){if(a[t].every(((t,r)=>{const o=t(n[r]);return Object.assign(e,o),o})))return e}}return null}function z(t){const e=(t||"").toUpperCase();let r=0,n=0;for(;n!==e.length;++n){const t=e.charCodeAt(n);t>=65&&t<=90&&(r=26*r+t-64)}return r-1}function K(t){let e=t,r="";for(;e>=0;)r=String.fromCharCode(e%26+65)+r,e=Math.floor(e/26)-1;return r}function V(t){return+t-1}function Q(t){return String(t+1)}function Y(t){const{top:e,left:r,bottom:n,right:o}=t;return{top:e,left:r,bottom:n,right:o,$left:!1,$right:!1,$top:!1,$bottom:!1}}function J(t){const e=t=>t?"$":"",{top:r,left:n,bottom:o,right:a,$left:i,$right:l,$top:u,$bottom:c}=t;return 0===r&&1048575===o?e(i)+K(n)+":"+e(l)+K(a):0===n&&16383===a?e(u)+Q(r)+":"+e(c)+Q(o):null==a||null==o||a===n&&o===r?e(i)+K(n)+e(u)+Q(r):e(i)+K(n)+e(u)+Q(r)+":"+e(l)+K(a)+e(c)+Q(o)}function tt(t){let e,r=0,n=0,o=1048575,a=16383,i=!1,l=!1,u=!1,c=!1;if(e=/^(\$?)([A-Z]{1,3}):(\$?)([A-Z]{1,3})$/.exec(t)){const t=z(e[2]),p=z(e[4]);return n=Math.min(t,p),a=Math.max(t,p),l=!!e[t<=p?1:3],c=!!e[t<=p?3:1],i=!0,u=!0,{top:r,left:n,bottom:o,right:a,$top:i,$left:l,$bottom:u,$right:c}}if(e=/^(\$?)([1-9]\d{0,6}):(\$?)([1-9]\d{0,6})$/.exec(t)){const t=V(e[2]),p=V(e[4]);return r=Math.min(t,p),o=Math.max(t,p),i=!!e[t<=p?1:3],u=!!e[t<=p?3:1],l=!0,c=!0,{top:r,left:n,bottom:o,right:a,$top:i,$left:l,$bottom:u,$right:c}}{const[p,s]=t.split(":");if(e=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(p))return n=z(e[2]),r=V(e[4]),l=!!e[1],i=!!e[3],s&&(e=/^(\$?)([A-Z]{1,3})(\$?)([1-9]\d{0,6})$/i.exec(s))?(a=z(e[2]),o=V(e[4]),c=!!e[1],u=!!e[3],o<r&&([r,o,i,u]=[o,r,u,i]),a<n&&([n,a,l,c]=[a,n,c,l])):(o=r,a=n,u=i,c=l),{top:r,left:n,bottom:o,right:a,$top:i,$left:l,$bottom:u,$right:c}}return null}function et(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const r=H(t,e,I);if(r&&(r.r0||r.name)){let t=null;return r.r0&&(t=r.r1?tt(r.r0+":"+r.r1):tt(r.r0)),r.name||t?(r.range=t,delete r.r0,delete r.r1,r):null}return null}var rt={fromCol:z,toCol:K,toRelative:Y,toAbsolute:function(t){const{top:e,left:r,bottom:n,right:o}=t;return{top:e,left:r,bottom:n,right:o,$left:!0,$right:!0,$top:!0,$bottom:!0}},to:J,from:tt,parse:et};function nt(){let t=1;return()=>"fxg"+t++}function ot(t,e){return e?String(t+1):t?"["+t+"]":""}function at(t){const{r0:e,c0:r,r1:n,c1:o,$c0:a,$c1:i,$r0:l,$r1:u}=t;if(0===e&&1048575===n){const t=ot(r,a),e=ot(o,i);return"C"+(t===e?t:t+":C"+e)}if(0===r&&16383===o){const t=ot(e,l),r=ot(n,u);return"R"+(t===r?t:t+":R"+r)}const c=ot(e,l),p=ot(n,u),s=ot(r,a),f=ot(o,i);return c!==p||s!==f?"R"+c+"C"+s+":R"+p+"C"+f:"R"+c+"C"+s}function it(t){let e=0,r=0,n=1048575,o=16383,a=!1,i=!1,l=!1,u=!1;const c=/^R(?:\[([+-]?\d+)\]|(\d+))?/.exec(t);c?(c[1]?e=parseInt(c[1],10):c[2]&&(e=parseInt(c[2],10)-1,a=!0),n=e,l=a,t=t.slice(c[0].length)):(a=!0,l=!0);const p=/^C(?:\[([+-]?\d+)\]|(\d+))?/.exec(t);return p?(p[1]?r=parseInt(p[1],10):p[2]&&(r=parseInt(p[2],10)-1,i=!0),o=r,u=i,t=t.slice(p[0].length)):(i=!0,u=!0),!c&&!p||t.length?null:{r0:e,c0:r,r1:n,c1:o,$r0:a,$c0:i,$r1:l,$c1:u}}function lt(t){const[e,r]=t.split(":",2),n=it(e);if(!n)return null;if(n&&r){const t=it(r);if(!t)return null;n.r1=t.r1,n.c1=t.c1,n.$r1=t.$r1,n.$c1=t.$c1}return n}var ut={to:at,from:lt,parse:function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const r=H(t,e,w);if(r&&(r.r0||r.name)){const t=r.r1?lt(r.r0+":"+r.r1):lt(r.r0);return r.name||t?(r.range=t,delete r.r0,delete r.r1,r):null}return null}};function ct(t,e,r,n){let o=t;return e||(o=r+t,o<0&&(o=n+o+1),o>n&&(o-=n+1)),o}const pt={OPERATOR:"operator",BOOLEAN:"bool",ERROR:"error",NUMBER:"number",FUNCTION:"function",NEWLINE:"newline",WHITESPACE:"whitespace",STRING:"string",PATH_QUOTE:"path-quote",PATH_BRACE:"path-brace",PATH_PREFIX:"path-prefix",RANGE:n,RANGE_BEAM:o,RANGE_NAMED:"range-named",FX_PREFIX:"fx-prefix",UNKNOWN:"unknown"};exports.MAX_COLS=16383,exports.MAX_ROWS=1048575,exports.a1=rt,exports.addMeta=function(t){let{sheetName:e="",workbookName:r=""}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const a=[];let i=null;const l={},u=nt();return t.forEach(((t,c)=>{if(t.index=c,t.depth=a.length,"("===t.value)t.depth=a.length+1,a.push(t);else if(")"===t.value){const e=a.pop();if(e){const r=u();t.groupId=r,t.depth=e.depth,e.groupId=r}else t.error=!0}else if("{"===t.value)i?t.error=!0:i=t;else if("}"===t.value){if(i){const e=u();t.groupId=e,i.groupId=e}else t.error=!0;i=null}else if(t.type===n||t.type===o){const n=et(t.value,!1),o=n&&`[${n.workbookName||r}]${n.sheetName||e}!${n.range?J(Y(n.range)):n.name}`.toLowerCase();o&&(o in l?t.groupId=l[o]:(t.groupId=u(),l[o]=t.groupId))}else"unknown"===t.type&&(t.error=!0)})),t},exports.rc=ut,exports.tokenTypes=pt,exports.tokenize=_,exports.translateToA1=function(t,e){const r=tt(e),a="string"==typeof t,i=a?_(t,{emitRanges:!1,mergeRanges:!1,r1c1:!0}):t;return i.forEach((t=>{if(t.type===n||t.type===o){const e={},n=lt(t.value),o=ct(n.r0,n.$r0,r.top,1048575),a=ct(n.r1,n.$r1,r.top,1048575);o>a?(e.top=a,e.$top=n.$r1,e.bottom=o,e.$bottom=n.$r0):(e.top=o,e.$top=n.$r0,e.bottom=a,e.$bottom=n.$r1);const i=ct(n.c0,n.$c0,r.left,16383),l=ct(n.c1,n.$c1,r.left,16383);i>l?(e.left=l,e.$left=n.$c1,e.right=i,e.$right=n.$c0):(e.left=i,e.$left=n.$c0,e.right=l,e.$right=n.$c1),t.value=J(e)}})),a?i.map((t=>t.value)).join(""):i},exports.translateToRC=function(t,e){const{top:r,left:a}=tt(e),i="string"==typeof t,l=i?_(t,{emitRanges:!1,mergeRanges:!1,r1c2:!1}):t;return l.forEach((t=>{if(t.type===n){const e={},n=tt(t.value);e.r0=n.$top?n.top:n.top-r,e.$r0=n.$top,e.r1=n.$bottom?n.bottom:n.bottom-r,e.$r1=n.$bottom,e.c0=n.$left?n.left:n.left-a,e.$c0=n.$left,e.c1=n.$right?n.right:n.right-a,e.$c1=n.$right,t.value=at(e)}else if(t.type===o){const e={},n=tt(t.value);e.r0=n.$top?n.top:n.top-r,e.$r0=n.$top,e.r1=n.$bottom?n.bottom:n.bottom-r,e.$r1=n.$bottom,e.c0=n.$left?n.left:n.left-a,e.$c0=n.$left,e.c1=n.$right?n.right:n.right-a,e.$c1=n.$right,t.value=at(e)}})),i?l.map((t=>t.value)).join(""):l};
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnguanMiLCJzb3VyY2VzIjpbXSwic291cmNlc0NvbnRlbnQiOltdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -10,67 +10,67 @@ Test.prototype.isMetaTokens = function isTokens (expr, result, opts) {
10
10
  test('add extra meta to operators', t => {
11
11
  // parens should be grouped and tagged with depth
12
12
  t.isMetaTokens('=((1)+(1))', [
13
- { type: FX_PREFIX, value: '=' },
14
- { type: OPERATOR, value: '(', depth: 0, groupId: 'fxg3' },
15
- { type: OPERATOR, value: '(', depth: 1, groupId: 'fxg1' },
16
- { type: NUMBER, value: '1' },
17
- { type: OPERATOR, value: ')', depth: 1, groupId: 'fxg1' },
18
- { type: OPERATOR, value: '+' },
19
- { type: OPERATOR, value: '(', depth: 1, groupId: 'fxg2' },
20
- { type: NUMBER, value: '1' },
21
- { type: OPERATOR, value: ')', depth: 1, groupId: 'fxg2' },
22
- { type: OPERATOR, value: ')', depth: 0, groupId: 'fxg3' }
13
+ { index: 0, depth: 0, type: FX_PREFIX, value: '=' },
14
+ { index: 1, depth: 1, type: OPERATOR, value: '(', groupId: 'fxg3' },
15
+ { index: 2, depth: 2, type: OPERATOR, value: '(', groupId: 'fxg1' },
16
+ { index: 3, depth: 2, type: NUMBER, value: '1' },
17
+ { index: 4, depth: 2, type: OPERATOR, value: ')', groupId: 'fxg1' },
18
+ { index: 5, depth: 1, type: OPERATOR, value: '+' },
19
+ { index: 6, depth: 2, type: OPERATOR, value: '(', groupId: 'fxg2' },
20
+ { index: 7, depth: 2, type: NUMBER, value: '1' },
21
+ { index: 8, depth: 2, type: OPERATOR, value: ')', groupId: 'fxg2' },
22
+ { index: 9, depth: 1, type: OPERATOR, value: ')', groupId: 'fxg3' }
23
23
  ]);
24
24
 
25
25
  // don't be fooled by imbalanced parens
26
26
  t.isMetaTokens('=)())', [
27
- { type: FX_PREFIX, value: '=' },
28
- { type: OPERATOR, value: ')', error: true },
29
- { type: OPERATOR, value: '(', depth: 0, groupId: 'fxg1' },
30
- { type: OPERATOR, value: ')', depth: 0, groupId: 'fxg1' },
31
- { type: OPERATOR, value: ')', error: true }
27
+ { index: 0, depth: 0, type: FX_PREFIX, value: '=' },
28
+ { index: 1, depth: 0, type: OPERATOR, value: ')', error: true },
29
+ { index: 2, depth: 1, type: OPERATOR, value: '(', groupId: 'fxg1' },
30
+ { index: 3, depth: 1, type: OPERATOR, value: ')', groupId: 'fxg1' },
31
+ { index: 4, depth: 0, type: OPERATOR, value: ')', error: true }
32
32
  ]);
33
33
 
34
34
  // don't be fooled by nested curlys
35
35
  t.isMetaTokens('={{}}', [
36
- { type: FX_PREFIX, value: '=' },
37
- { type: OPERATOR, value: '{', groupId: 'fxg1' },
38
- { type: OPERATOR, value: '{', error: true },
39
- { type: OPERATOR, value: '}', groupId: 'fxg1' },
40
- { type: OPERATOR, value: '}', error: true }
36
+ { index: 0, depth: 0, type: FX_PREFIX, value: '=' },
37
+ { index: 1, depth: 0, type: OPERATOR, value: '{', groupId: 'fxg1' },
38
+ { index: 2, depth: 0, type: OPERATOR, value: '{', error: true },
39
+ { index: 3, depth: 0, type: OPERATOR, value: '}', groupId: 'fxg1' },
40
+ { index: 4, depth: 0, type: OPERATOR, value: '}', error: true }
41
41
  ]);
42
42
 
43
43
  // group ranges if they are equivalent
44
44
  t.isMetaTokens("=B11,B11:B12,'Sheet11'!B11,SHEET1!$B11,sheet1!$b$11,A1:B11,[foo]Sheet1!B11,'[foo]Sheet1'!B11", [
45
- { type: FX_PREFIX, value: '=' },
46
- { type: RANGE, value: 'B11', groupId: 'fxg1' },
47
- { type: OPERATOR, value: ',' },
48
- { type: RANGE, value: 'B11:B12', groupId: 'fxg2' },
49
- { type: OPERATOR, value: ',' },
50
- { type: RANGE, value: "'Sheet11'!B11", groupId: 'fxg3' },
51
- { type: OPERATOR, value: ',' },
52
- { type: RANGE, value: 'SHEET1!$B11', groupId: 'fxg1' },
53
- { type: OPERATOR, value: ',' },
54
- { type: RANGE, value: 'sheet1!$b$11', groupId: 'fxg1' },
55
- { type: OPERATOR, value: ',' },
56
- { type: RANGE, value: 'A1:B11', groupId: 'fxg4' },
57
- { type: OPERATOR, value: ',' },
58
- { type: RANGE, value: '[foo]Sheet1!B11', groupId: 'fxg1' },
59
- { type: OPERATOR, value: ',' },
60
- { type: RANGE, value: "'[foo]Sheet1'!B11", groupId: 'fxg1' }
45
+ { index: 0, depth: 0, type: FX_PREFIX, value: '=' },
46
+ { index: 1, depth: 0, type: RANGE, value: 'B11', groupId: 'fxg1' },
47
+ { index: 2, depth: 0, type: OPERATOR, value: ',' },
48
+ { index: 3, depth: 0, type: RANGE, value: 'B11:B12', groupId: 'fxg2' },
49
+ { index: 4, depth: 0, type: OPERATOR, value: ',' },
50
+ { index: 5, depth: 0, type: RANGE, value: "'Sheet11'!B11", groupId: 'fxg3' },
51
+ { index: 6, depth: 0, type: OPERATOR, value: ',' },
52
+ { index: 7, depth: 0, type: RANGE, value: 'SHEET1!$B11', groupId: 'fxg1' },
53
+ { index: 8, depth: 0, type: OPERATOR, value: ',' },
54
+ { index: 9, depth: 0, type: RANGE, value: 'sheet1!$b$11', groupId: 'fxg1' },
55
+ { index: 10, depth: 0, type: OPERATOR, value: ',' },
56
+ { index: 11, depth: 0, type: RANGE, value: 'A1:B11', groupId: 'fxg4' },
57
+ { index: 12, depth: 0, type: OPERATOR, value: ',' },
58
+ { index: 13, depth: 0, type: RANGE, value: '[foo]Sheet1!B11', groupId: 'fxg1' },
59
+ { index: 14, depth: 0, type: OPERATOR, value: ',' },
60
+ { index: 15, depth: 0, type: RANGE, value: "'[foo]Sheet1'!B11", groupId: 'fxg1' }
61
61
  ], { sheetName: 'Sheet1', workbookName: 'foo' });
62
62
 
63
63
  t.isMetaTokens('=A:A,1:1,Sheet1!A:A:1:1,[foo]Sheet1!1:1', [
64
- { type: FX_PREFIX, value: '=' },
65
- { type: RANGE_BEAM, value: 'A:A', groupId: 'fxg1' },
66
- { type: OPERATOR, value: ',' },
67
- { type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
68
- { type: OPERATOR, value: ',' },
69
- { type: RANGE_BEAM, value: 'Sheet1!A:A', groupId: 'fxg1' },
70
- { type: OPERATOR, value: ':' },
71
- { type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
72
- { type: OPERATOR, value: ',' },
73
- { type: RANGE_BEAM, value: '[foo]Sheet1!1:1', groupId: 'fxg2' }
64
+ { index: 0, depth: 0, type: FX_PREFIX, value: '=' },
65
+ { index: 1, depth: 0, type: RANGE_BEAM, value: 'A:A', groupId: 'fxg1' },
66
+ { index: 2, depth: 0, type: OPERATOR, value: ',' },
67
+ { index: 3, depth: 0, type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
68
+ { index: 4, depth: 0, type: OPERATOR, value: ',' },
69
+ { index: 5, depth: 0, type: RANGE_BEAM, value: 'Sheet1!A:A', groupId: 'fxg1' },
70
+ { index: 6, depth: 0, type: OPERATOR, value: ':' },
71
+ { index: 7, depth: 0, type: RANGE_BEAM, value: '1:1', groupId: 'fxg2' },
72
+ { index: 8, depth: 0, type: OPERATOR, value: ',' },
73
+ { index: 9, depth: 0, type: RANGE_BEAM, value: '[foo]Sheet1!1:1', groupId: 'fxg2' }
74
74
  ], { sheetName: 'Sheet1', workbookName: 'foo' });
75
75
 
76
76
  t.end();
package/lib/addMeta.js CHANGED
@@ -13,9 +13,11 @@ export function addMeta (tokens, { sheetName = '', workbookName = '' } = {}) {
13
13
  const a1Map = {};
14
14
  const uid = getIDer();
15
15
 
16
- tokens.forEach(token => {
16
+ tokens.forEach((token, i) => {
17
+ token.index = i;
18
+ token.depth = parenStack.length;
17
19
  if (token.value === '(') {
18
- token.depth = parenStack.length;
20
+ token.depth = parenStack.length + 1;
19
21
  parenStack.push(token);
20
22
  }
21
23
  else if (token.value === ')') {
package/lib/constants.js CHANGED
@@ -23,9 +23,9 @@ export const MAX_ROWS = 2 ** 20 - 1; // 1048575
23
23
  const re_ERROR = /^#(NAME\?|FIELD!|CALC!|VALUE!|REF!|DIV\/0!|NULL!|NUM!|N\/A|GETTING_DATA\b|SPILL!|UNKNOWN!|FIELD\b|CALC\b|SYNTAX\?|ERROR!)/i;
24
24
  const re_OPERATOR = /^(<=|>=|<>|[-+/*^%&<>=]|[{},;]|[()]|@|:|!|#)/;
25
25
  const re_BOOLEAN = /^(TRUE|FALSE)\b/i;
26
- const re_FUNCTION = /^[A-Z]+(?=\s*\()/i;
26
+ const re_FUNCTION = /^[A-Z_]+[A-Z\d_.]+(?=\s*\()/i;
27
27
  const re_NEWLINE = /^\n+/;
28
- const re_WHITESPACE = /^\s+/;
28
+ const re_WHITESPACE = /^[ \f\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/;
29
29
  const re_STRING = /^"(?:""|[^"])*("|$)/;
30
30
  const re_PATH_QUOTE = /^'(?:''|[^'])*('|$)/;
31
31
  const re_PATH_BRACE = /^\[(?:[^\]])+(\]|$)/;
package/lib/lexer-test.js CHANGED
@@ -5,6 +5,9 @@ import { tokenize } from './lexer.js';
5
5
  Test.prototype.isTokens = function isTokens (expr, result, opts) {
6
6
  this.deepEqual(tokenize(expr, (opts || {})), result, expr);
7
7
  };
8
+ Test.prototype.isTokensNeg = function isTokensNeg (expr, result, opts) {
9
+ this.deepEqual(tokenize(expr, { ...opts, negativeNumbers: true }), result, expr);
10
+ };
8
11
 
9
12
  test('tokenize operators', t => {
10
13
  t.isTokens('=1>1', [
@@ -269,6 +272,56 @@ test('tokenize functions', t => {
269
272
  { type: BOOLEAN, value: 'TRUE' },
270
273
  { type: OPERATOR, value: ')' }
271
274
  ]);
275
+ t.isTokens('=BINOM.DIST.RANGE(1)', [
276
+ { type: FX_PREFIX, value: '=' },
277
+ { type: FUNCTION, value: 'BINOM.DIST.RANGE' },
278
+ { type: OPERATOR, value: '(' },
279
+ { type: NUMBER, value: '1' },
280
+ { type: OPERATOR, value: ')' }
281
+ ]);
282
+ t.isTokens('=OCT2BIN(1)', [
283
+ { type: FX_PREFIX, value: '=' },
284
+ { type: FUNCTION, value: 'OCT2BIN' },
285
+ { type: OPERATOR, value: '(' },
286
+ { type: NUMBER, value: '1' },
287
+ { type: OPERATOR, value: ')' }
288
+ ]);
289
+ t.isTokens('=TEST_FUNC(1)', [
290
+ { type: FX_PREFIX, value: '=' },
291
+ { type: FUNCTION, value: 'TEST_FUNC' },
292
+ { type: OPERATOR, value: '(' },
293
+ { type: NUMBER, value: '1' },
294
+ { type: OPERATOR, value: ')' }
295
+ ]);
296
+ t.isTokens('=_xlfn.FOO(1)', [
297
+ { type: FX_PREFIX, value: '=' },
298
+ { type: FUNCTION, value: '_xlfn.FOO' },
299
+ { type: OPERATOR, value: '(' },
300
+ { type: NUMBER, value: '1' },
301
+ { type: OPERATOR, value: ')' }
302
+ ]);
303
+ t.isTokens('=_FOO(1)', [
304
+ { type: FX_PREFIX, value: '=' },
305
+ { type: FUNCTION, value: '_FOO' },
306
+ { type: OPERATOR, value: '(' },
307
+ { type: NUMBER, value: '1' },
308
+ { type: OPERATOR, value: ')' }
309
+ ]);
310
+ t.isTokens('=.FOO(1)', [
311
+ { type: FX_PREFIX, value: '=' },
312
+ { type: RANGE_NAMED, value: '.FOO' },
313
+ { type: OPERATOR, value: '(' },
314
+ { type: NUMBER, value: '1' },
315
+ { type: OPERATOR, value: ')' }
316
+ ]);
317
+ t.isTokens('=9FOO(1)', [
318
+ { type: FX_PREFIX, value: '=' },
319
+ { type: NUMBER, value: '9' },
320
+ { type: FUNCTION, value: 'FOO' },
321
+ { type: OPERATOR, value: '(' },
322
+ { type: NUMBER, value: '1' },
323
+ { type: OPERATOR, value: ')' }
324
+ ]);
272
325
  t.end();
273
326
  });
274
327
 
@@ -277,9 +330,9 @@ test('tokenize numbers', t => {
277
330
  { type: FX_PREFIX, value: '=' },
278
331
  { type: NUMBER, value: '0' }
279
332
  ]);
280
- t.isTokens('=-0', [
333
+ t.isTokens('=+0', [
281
334
  { type: FX_PREFIX, value: '=' },
282
- { type: OPERATOR, value: '-' },
335
+ { type: OPERATOR, value: '+' },
283
336
  { type: NUMBER, value: '0' }
284
337
  ]);
285
338
  t.isTokens('=+1', [
@@ -338,6 +391,231 @@ test('tokenize numbers', t => {
338
391
  t.end();
339
392
  });
340
393
 
394
+ test('tokenize negative numbers', t => {
395
+ t.isTokensNeg('=-0', [
396
+ { type: FX_PREFIX, value: '=' },
397
+ { type: NUMBER, value: '-0' }
398
+ ]);
399
+ t.isTokensNeg('=-1123', [
400
+ { type: FX_PREFIX, value: '=' },
401
+ { type: NUMBER, value: '-1123' }
402
+ ]);
403
+ t.isTokensNeg('=-1.5', [
404
+ { type: FX_PREFIX, value: '=' },
405
+ { type: NUMBER, value: '-1.5' }
406
+ ]);
407
+ t.isTokensNeg('=-1234.5678', [
408
+ { type: FX_PREFIX, value: '=' },
409
+ { type: NUMBER, value: '-1234.5678' }
410
+ ]);
411
+ t.isTokensNeg('=1E-1', [
412
+ { type: FX_PREFIX, value: '=' },
413
+ { type: NUMBER, value: '1E-1' }
414
+ ]);
415
+ t.isTokensNeg('=-1E-1', [
416
+ { type: FX_PREFIX, value: '=' },
417
+ { type: NUMBER, value: '-1E-1' }
418
+ ]);
419
+ t.isTokensNeg('=1.5E-10', [
420
+ { type: FX_PREFIX, value: '=' },
421
+ { type: NUMBER, value: '1.5E-10' }
422
+ ]);
423
+ t.isTokensNeg('=-1.5E-10', [
424
+ { type: FX_PREFIX, value: '=' },
425
+ { type: NUMBER, value: '-1.5E-10' }
426
+ ]);
427
+ t.isTokensNeg('-1', [
428
+ { type: 'number', value: '-1' }
429
+ ]);
430
+
431
+ //
432
+ t.isTokensNeg('=1-1', [
433
+ { type: FX_PREFIX, value: '=' },
434
+ { type: NUMBER, value: '1' },
435
+ { type: OPERATOR, value: '-' },
436
+ { type: NUMBER, value: '1' }
437
+ ]);
438
+ t.isTokensNeg('1--1', [
439
+ { type: 'number', value: '1' },
440
+ { type: 'operator', value: '-' },
441
+ { type: 'number', value: '-1' }
442
+ ]);
443
+ t.isTokensNeg('1 - -1', [
444
+ { type: 'number', value: '1' },
445
+ { type: 'whitespace', value: ' ' },
446
+ { type: 'operator', value: '-' },
447
+ { type: 'whitespace', value: ' ' },
448
+ { type: 'number', value: '-1' }
449
+ ]);
450
+ t.isTokensNeg('1 - - 1', [
451
+ { type: 'number', value: '1' },
452
+ { type: 'whitespace', value: ' ' },
453
+ { type: 'operator', value: '-' },
454
+ { type: 'whitespace', value: ' ' },
455
+ { type: 'operator', value: '-' },
456
+ { type: 'whitespace', value: ' ' },
457
+ { type: 'number', value: '1' }
458
+ ]);
459
+ t.isTokensNeg('1 \n - \n -1', [
460
+ { type: 'number', value: '1' },
461
+ { type: 'whitespace', value: ' ' },
462
+ { type: 'newline', value: '\n' },
463
+ { type: 'whitespace', value: ' ' },
464
+ { type: 'operator', value: '-' },
465
+ { type: 'whitespace', value: ' ' },
466
+ { type: 'newline', value: '\n' },
467
+ { type: 'whitespace', value: ' ' },
468
+ { type: 'number', value: '-1' }
469
+ ]);
470
+ t.isTokensNeg('-(-1)', [
471
+ { type: 'operator', value: '-' },
472
+ { type: 'operator', value: '(' },
473
+ { type: 'number', value: '-1' },
474
+ { type: 'operator', value: ')' }
475
+ ]);
476
+ t.isTokensNeg('-( -1 )', [
477
+ { type: 'operator', value: '-' },
478
+ { type: 'operator', value: '(' },
479
+ { type: 'whitespace', value: ' ' },
480
+ { type: 'number', value: '-1' },
481
+ { type: 'whitespace', value: ' ' },
482
+ { type: 'operator', value: ')' }
483
+ ]);
484
+
485
+ t.isTokensNeg('=true-1', [
486
+ { type: 'fx-prefix', value: '=' },
487
+ { type: 'bool', value: 'true' },
488
+ { type: 'operator', value: '-' },
489
+ { type: 'number', value: '1' }
490
+ ]);
491
+ t.isTokensNeg('=true -1', [
492
+ { type: 'fx-prefix', value: '=' },
493
+ { type: 'bool', value: 'true' },
494
+ { type: 'whitespace', value: ' ' },
495
+ { type: 'operator', value: '-' },
496
+ { type: 'number', value: '1' }
497
+ ]);
498
+ t.isTokensNeg('=true - 1', [
499
+ { type: 'fx-prefix', value: '=' },
500
+ { type: 'bool', value: 'true' },
501
+ { type: 'whitespace', value: ' ' },
502
+ { type: 'operator', value: '-' },
503
+ { type: 'whitespace', value: ' ' },
504
+ { type: 'number', value: '1' }
505
+ ]);
506
+ t.isTokensNeg('=#VALUE!-1', [
507
+ { type: 'fx-prefix', value: '=' },
508
+ { type: 'error', value: '#VALUE!' },
509
+ { type: 'operator', value: '-' },
510
+ { type: 'number', value: '1' }
511
+ ]);
512
+ t.isTokensNeg('=#VALUE! -1', [
513
+ { type: 'fx-prefix', value: '=' },
514
+ { type: 'error', value: '#VALUE!' },
515
+ { type: 'whitespace', value: ' ' },
516
+ { type: 'operator', value: '-' },
517
+ { type: 'number', value: '1' }
518
+ ]);
519
+ t.isTokensNeg('=SUM(-1) -1', [
520
+ { type: 'fx-prefix', value: '=' },
521
+ { type: 'function', value: 'SUM' },
522
+ { type: 'operator', value: '(' },
523
+ { type: 'number', value: '-1' },
524
+ { type: 'operator', value: ')' },
525
+ { type: 'whitespace', value: ' ' },
526
+ { type: 'operator', value: '-' },
527
+ { type: 'number', value: '1' }
528
+ ]);
529
+ t.isTokensNeg('=SUM( -1)-1', [
530
+ { type: 'fx-prefix', value: '=' },
531
+ { type: 'function', value: 'SUM' },
532
+ { type: 'operator', value: '(' },
533
+ { type: 'whitespace', value: ' ' },
534
+ { type: 'number', value: '-1' },
535
+ { type: 'operator', value: ')' },
536
+ { type: 'operator', value: '-' },
537
+ { type: 'number', value: '1' }
538
+ ]);
539
+ t.isTokensNeg('=A1-1', [
540
+ { type: 'fx-prefix', value: '=' },
541
+ { type: 'range', value: 'A1' },
542
+ { type: 'operator', value: '-' },
543
+ { type: 'number', value: '1' }
544
+ ]);
545
+ t.isTokensNeg('=A1 -1', [
546
+ { type: 'fx-prefix', value: '=' },
547
+ { type: 'range', value: 'A1' },
548
+ { type: 'whitespace', value: ' ' },
549
+ { type: 'operator', value: '-' },
550
+ { type: 'number', value: '1' }
551
+ ]);
552
+ t.isTokensNeg('=foo-1', [
553
+ { type: 'fx-prefix', value: '=' },
554
+ { type: 'range-named', value: 'foo' },
555
+ { type: 'operator', value: '-' },
556
+ { type: 'number', value: '1' }
557
+ ]);
558
+ t.isTokensNeg('=foo -1', [
559
+ { type: 'fx-prefix', value: '=' },
560
+ { type: 'range-named', value: 'foo' },
561
+ { type: 'whitespace', value: ' ' },
562
+ { type: 'operator', value: '-' },
563
+ { type: 'number', value: '1' }
564
+ ]);
565
+ t.isTokensNeg('="true"-1', [
566
+ { type: 'fx-prefix', value: '=' },
567
+ { type: 'string', value: '"true"' },
568
+ { type: 'operator', value: '-' },
569
+ { type: 'number', value: '1' }
570
+ ]);
571
+ t.isTokensNeg('="true" -1', [
572
+ { type: 'fx-prefix', value: '=' },
573
+ { type: 'string', value: '"true"' },
574
+ { type: 'whitespace', value: ' ' },
575
+ { type: 'operator', value: '-' },
576
+ { type: 'number', value: '1' }
577
+ ]);
578
+
579
+ t.isTokensNeg('=SUM(1)-1', [
580
+ { type: FX_PREFIX, value: '=' },
581
+ { type: FUNCTION, value: 'SUM' },
582
+ { type: OPERATOR, value: '(' },
583
+ { type: NUMBER, value: '1' },
584
+ { type: OPERATOR, value: ')' },
585
+ { type: OPERATOR, value: '-' },
586
+ { type: NUMBER, value: '1' }
587
+ ]);
588
+ t.isTokensNeg('={1, 2, 3}-4', [
589
+ { type: FX_PREFIX, value: '=' },
590
+ { type: OPERATOR, value: '{' },
591
+ { type: NUMBER, value: '1' },
592
+ { type: OPERATOR, value: ',' },
593
+ { type: WHITESPACE, value: ' ' },
594
+ { type: NUMBER, value: '2' },
595
+ { type: OPERATOR, value: ',' },
596
+ { type: WHITESPACE, value: ' ' },
597
+ { type: NUMBER, value: '3' },
598
+ { type: OPERATOR, value: '}' },
599
+ { type: OPERATOR, value: '-' },
600
+ { type: NUMBER, value: '4' }
601
+ ]);
602
+ t.isTokensNeg('=10%-1', [
603
+ { type: FX_PREFIX, value: '=' },
604
+ { type: NUMBER, value: '10' },
605
+ { type: OPERATOR, value: '%' },
606
+ { type: OPERATOR, value: '-' },
607
+ { type: NUMBER, value: '1' }
608
+ ]);
609
+ t.isTokensNeg('=A1#-1', [
610
+ { type: FX_PREFIX, value: '=' },
611
+ { type: RANGE, value: 'A1' },
612
+ { type: OPERATOR, value: '#' },
613
+ { type: OPERATOR, value: '-' },
614
+ { type: NUMBER, value: '1' }
615
+ ]);
616
+ t.end();
617
+ });
618
+
341
619
  test('tokenize simple equations', t => {
342
620
  t.isTokens('=1 + 2', [
343
621
  { type: FX_PREFIX, value: '=' },
@@ -1058,10 +1336,19 @@ test('tokenize strings', t => {
1058
1336
  { type: STRING, value: '"data"' }
1059
1337
  ]);
1060
1338
  // we should be able to highlight things that are still being typed
1061
- // so open ended strings at the end of output are tagged.
1339
+ // so open-ended STRING, PATH_BRACE, and PATH_QUOTE tokens at the
1340
+ // end of output are tagged.
1062
1341
  t.isTokens('="incomple', [
1063
1342
  { type: FX_PREFIX, value: '=' },
1064
- { type: STRING, value: '"incomple' }
1343
+ { type: STRING, value: '"incomple', unterminated: true }
1344
+ ]);
1345
+ t.isTokens('=[Foo', [
1346
+ { type: FX_PREFIX, value: '=' },
1347
+ { type: PATH_BRACE, value: '[Foo', unterminated: true }
1348
+ ]);
1349
+ t.isTokens("='Sheet name", [
1350
+ { type: FX_PREFIX, value: '=' },
1351
+ { type: PATH_QUOTE, value: "'Sheet name", unterminated: true }
1065
1352
  ]);
1066
1353
 
1067
1354
  t.end();
package/lib/lexer.js CHANGED
@@ -1,12 +1,17 @@
1
1
  import {
2
2
  FX_PREFIX,
3
+ NEWLINE,
4
+ NUMBER,
5
+ OPERATOR,
3
6
  PATH_BRACE,
4
7
  PATH_PREFIX,
5
8
  PATH_QUOTE,
6
9
  RANGE,
7
- RANGE_NAMED,
8
10
  RANGE_BEAM,
11
+ RANGE_NAMED,
12
+ STRING,
9
13
  UNKNOWN,
14
+ WHITESPACE,
10
15
  tokenHandlersA1,
11
16
  tokenHandlersRC
12
17
  } from './constants.js';
@@ -15,10 +20,22 @@ const isType = (t, type) => t && t.type === type;
15
20
  const isRangeOp = t => t && t.value === ':';
16
21
  const isBangOp = t => t && t.value === '!';
17
22
 
18
- export function getTokens (fx, tokenHandlers = [], emitRanges = false, mergeRanges = false) {
23
+ const defaultOptions = {
24
+ emitRanges: false,
25
+ mergeRanges: true,
26
+ negativeNumbers: false,
27
+ r1c1: false
28
+ };
29
+
30
+ export function getTokens (fx, tokenHandlers, options = {}) {
31
+ const { emitRanges, mergeRanges, negativeNumbers } = Object.assign({}, defaultOptions, options);
19
32
  const tokens = [];
20
33
  let pos = 0;
21
34
  const lookBehind = n => tokens[tokens.length - n];
35
+ const lookBehindIgnoreWS = n => {
36
+ const noWs = tokens.filter(t => !isType(t, WHITESPACE) && !isType(t, NEWLINE));
37
+ return noWs[noWs.length - n];
38
+ };
22
39
 
23
40
  if (/^=/.test(fx)) {
24
41
  const token = {
@@ -58,6 +75,29 @@ export function getTokens (fx, tokenHandlers = [], emitRanges = false, mergeRang
58
75
  ...(emitRanges ? { range: [ startPos, pos ] } : {})
59
76
  };
60
77
 
78
+ if (tokenType === STRING && !tokenValue.endsWith('"')) {
79
+ token.unterminated = true;
80
+ }
81
+ else if (tokenType === PATH_BRACE && !tokenValue.endsWith(']')) {
82
+ token.unterminated = true;
83
+ }
84
+ else if (tokenType === PATH_QUOTE && !tokenValue.endsWith("'")) {
85
+ token.unterminated = true;
86
+ }
87
+
88
+ if (negativeNumbers && tokenType === NUMBER) {
89
+ const last1 = lookBehind(1);
90
+ if (last1 && isType(last1, OPERATOR) && last1.value === '-') {
91
+ // we have a number preceded by a minus
92
+ const last2 = lookBehindIgnoreWS(2);
93
+ // missing last2 means we are at the start of the stream
94
+ if (!last2 || isType(last2, FX_PREFIX) || (isType(last2, OPERATOR) && ![ '%', '}', ')', '#' ].includes(last2.value))) {
95
+ tokens.pop();
96
+ token.value = '-' + tokenValue;
97
+ }
98
+ }
99
+ }
100
+
61
101
  if (mergeRanges) {
62
102
  if (tokenType === RANGE || tokenType === RANGE_NAMED || tokenType === RANGE_BEAM) {
63
103
  const merge = [];
@@ -94,7 +134,7 @@ export function getTokens (fx, tokenHandlers = [], emitRanges = false, mergeRang
94
134
 
95
135
  // Formulas can either have RC or A1 style refs, not both: because C1 and R1 are both!
96
136
  // Refmode: A1 | RC | Anostic emit ranges with RANGE
97
- export function tokenize (fx, { emitRanges = false, mergeRanges = true, r1c1 = false } = {}) {
98
- const tokenHandlers = r1c1 ? tokenHandlersRC : tokenHandlersA1;
99
- return getTokens(fx, tokenHandlers, emitRanges, mergeRanges);
137
+ export function tokenize (fx, options = {}) {
138
+ const tokenHandlers = options.r1c1 ? tokenHandlersRC : tokenHandlersA1;
139
+ return getTokens(fx, tokenHandlers, options);
100
140
  }
package/lib/parseRef.js CHANGED
@@ -51,7 +51,10 @@ const validRunsNamed = validRuns.concat([
51
51
  ]);
52
52
 
53
53
  export function parseRef (ref, allow_named = true, tokenHandlers = []) {
54
- const tokens = getTokens(ref, tokenHandlers, false, false);
54
+ const tokens = getTokens(ref, tokenHandlers, {
55
+ emitRanges: false,
56
+ mergeRanges: false
57
+ });
55
58
  const refData = {
56
59
  sheetName: '',
57
60
  workbookName: '',
package/package.json CHANGED
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "name": "@borgar/fx",
3
- "version": "1.1.1",
3
+ "version": "2.1.0",
4
4
  "description": "Utilities for working with Excel formulas",
5
5
  "main": "dist/fx.js",
6
6
  "module": "lib/index.js",
7
7
  "exports": {
8
8
  ".": {
9
- "require": "./dist/fx.js",
9
+ "require": "./dist/fx.js",
10
10
  "default": "./lib/index.js"
11
11
  }
12
12
  },
13
13
  "scripts": {
14
14
  "lint": "eslint index.js lib/*.js",
15
- "test": "tape run lib/*-test.js | tap-min",
15
+ "test": "tape lib/*-test.js | tap-min",
16
16
  "build": "NODE_ENV=production rollup -c"
17
17
  },
18
18
  "repository": {
19
19
  "type": "git",
20
- "url": "git+https://github.com/borgar/xlsx-reader.git"
20
+ "url": "git+https://github.com/borgar/fx.git"
21
21
  },
22
22
  "bugs": {
23
- "url": "https://github.com/borgar/xlsx-reader/issues"
23
+ "url": "https://github.com/borgar/fx/issues"
24
24
  },
25
25
  "browserslist": [
26
26
  "defaults",
@@ -36,16 +36,16 @@
36
36
  "author": "Borgar Þorsteinsson <borgar@borgar.net> (http://borgar.net/)",
37
37
  "license": "MIT",
38
38
  "devDependencies": {
39
- "@babel/core": "~7.15.8",
40
- "@babel/eslint-parser": "~7.15.4",
41
- "@babel/preset-env": "~7.16.0",
39
+ "@babel/core": "~7.19.6",
40
+ "@babel/eslint-parser": "~7.19.1",
41
+ "@babel/preset-env": "~7.19.4",
42
42
  "@borgar/eslint-config": "~2.2.1",
43
- "@rollup/plugin-babel": "~5.3.0",
43
+ "@rollup/plugin-babel": "~6.0.2",
44
44
  "babel-eslint": "~10.1.0",
45
- "eslint": "~7.32.0",
46
- "rollup": "~2.60.0",
47
- "rollup-plugin-uglify": "~6.0.4",
45
+ "eslint": "~8.26.0",
46
+ "rollup": "~3.2.3",
47
+ "rollup-plugin-minification": "~0.2.0",
48
48
  "tap-min": "~2.0.0",
49
- "tape": "~5.3.1"
49
+ "tape": "~5.6.1"
50
50
  }
51
51
  }
@@ -1,7 +1,8 @@
1
+ import fs from 'fs';
1
2
  import babel from '@rollup/plugin-babel';
2
- import { uglify } from 'rollup-plugin-uglify';
3
- import pkg from './package.json';
3
+ import { terser } from 'rollup-plugin-minification';
4
4
 
5
+ const pkg = JSON.parse(fs.readFileSync('./package.json'));
5
6
  const isProd = process.env.NODE_ENV === 'production';
6
7
 
7
8
  export default {
@@ -16,6 +17,6 @@ export default {
16
17
  file: pkg.main,
17
18
  format: 'cjs',
18
19
  sourcemap: 'inline',
19
- plugins: [ isProd && uglify() ]
20
+ plugins: [ isProd && terser() ]
20
21
  }
21
22
  };