@khanacademy/kas 0.2.3
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/CHANGELOG.md +7 -0
- package/LICENSE.txt +21 -0
- package/README.md +94 -0
- package/dist/es/index.js +2 -0
- package/dist/es/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.flow +2 -0
- package/dist/index.js.map +1 -0
- package/experimenter.html +75 -0
- package/package.json +38 -0
- package/src/__genfiles__/parser.js +840 -0
- package/src/__genfiles__/unitparser.js +679 -0
- package/src/__tests__/checking-form_test.js +76 -0
- package/src/__tests__/comparing_test.js +322 -0
- package/src/__tests__/compilation_test.js +97 -0
- package/src/__tests__/evaluating_test.js +73 -0
- package/src/__tests__/index_test.js +364 -0
- package/src/__tests__/parsing_test.js +480 -0
- package/src/__tests__/rendering_test.js +272 -0
- package/src/__tests__/transforming_test.js +331 -0
- package/src/__tests__/units_test.js +188 -0
- package/src/compare.js +69 -0
- package/src/index.js +2 -0
- package/src/nodes.js +3504 -0
- package/src/parser-generator.js +212 -0
- package/src/unitvalue.jison +161 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/__genfiles__/unitparser.js","../../src/__genfiles__/parser.js","../../src/nodes.js","../../src/compare.js"],"sourcesContent":["// this is a @generated file\n\n/* parser generated by jison 0.4.15 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,11],$V1=[1,9],$V2=[8,17],$V3=[6,11],$V4=[6,11,13,17];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"unitvalue\":3,\"magnitude\":4,\"unit\":5,\"EOF\":6,\"float\":7,\"POW\":8,\"int\":9,\"multatoms\":10,\"DIV\":11,\"expatom\":12,\"MUL\":13,\"atom\":14,\"^\":15,\"nat\":16,\"ATOM\":17,\"FLOAT\":18,\"NAT\":19,\"NEG\":20,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"EOF\",8:\"POW\",11:\"DIV\",13:\"MUL\",15:\"^\",17:\"ATOM\",18:\"FLOAT\",19:\"NAT\",20:\"NEG\"},\nproductions_: [0,[3,3],[3,2],[4,3],[4,1],[5,3],[5,1],[10,3],[10,2],[10,1],[12,3],[12,1],[14,1],[7,1],[7,1],[16,1],[9,2],[9,1]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n\n return {\n type: \"unitMagnitude\",\n magnitude: $$[$0-2],\n unit: $$[$0-1],\n };\n \nbreak;\ncase 2:\n\n return {\n type: \"unitStandalone\",\n unit: $$[$0-1],\n }\n \nbreak;\ncase 3:\n\n this.$ = $$[$0-2] + \"e\" + $$[$0];\n \nbreak;\ncase 4: case 13: case 14: case 15: case 17:\n this.$ = $$[$0]; \nbreak;\ncase 5:\n\n this.$ = {\n num: $$[$0-2],\n denom: $$[$0],\n };\n \nbreak;\ncase 6:\n\n this.$ = {\n num: $$[$0],\n denom: null,\n };\n \nbreak;\ncase 7:\n this.$ = [$$[$0-2]].concat($$[$0]); \nbreak;\ncase 8:\n this.$ = [$$[$0-1]].concat($$[$0]); \nbreak;\ncase 9:\n this.$ = [$$[$0]]; \nbreak;\ncase 10:\n\n this.$ = {\n name: $$[$0-2],\n pow: $$[$0],\n };\n \nbreak;\ncase 11:\n\n this.$ = {\n name: $$[$0],\n pow: 1,\n };\n \nbreak;\ncase 12:\n this.$ = yytext; \nbreak;\ncase 16:\n this.$ = \"-\" + $$[$0]; \nbreak;\n}\n},\ntable: [{3:1,4:2,5:3,7:4,10:5,12:8,14:10,16:7,17:$V0,18:[1,6],19:$V1},{1:[3]},{5:12,10:5,12:8,14:10,17:$V0},{6:[1,13]},{8:[1,14],17:[2,4]},{6:[2,6],11:[1,15]},o($V2,[2,13]),o($V2,[2,14]),o($V3,[2,9],{12:8,14:10,10:17,13:[1,16],17:$V0}),o([6,8,11,13,17],[2,15]),o($V4,[2,11],{15:[1,18]}),o([6,11,13,15,17],[2,12]),{6:[1,19]},{1:[2,2]},{9:20,19:[1,22],20:[1,21]},{10:23,12:8,14:10,17:$V0},{10:24,12:8,14:10,17:$V0},o($V3,[2,8]),{16:25,19:$V1},{1:[2,1]},{17:[2,3]},{19:[1,26]},{17:[2,17]},{6:[2,5]},o($V3,[2,7]),o($V4,[2,10]),{17:[2,16]}],\ndefaultActions: {13:[2,2],19:[2,1],20:[2,3],22:[2,17],23:[2,5],26:[2,16]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n throw new Error(str);\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n //_token_stack:\n function lex() {\n var token;\n token = lexer.lex() || EOF;\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:return 11;\nbreak;\ncase 1:return '(';\nbreak;\ncase 2:return ')';\nbreak;\ncase 3:return 8;\nbreak;\ncase 4:return 15;\nbreak;\ncase 5:return 13;\nbreak;\ncase 6:return 18;\nbreak;\ncase 7:return 19;\nbreak;\ncase 8:return 20;\nbreak;\ncase 9:return 17;\nbreak;\ncase 10:return 17;\nbreak;\ncase 11:return 17;\nbreak;\ncase 12:/* skip whitespace */\nbreak;\ncase 13:return 6;\nbreak;\n}\n},\nrules: [/^(?:\\/)/,/^(?:\\()/,/^(?:\\))/,/^(?:(\\*|x|\\u00d7|\\u2219|\\u22c5|\\u00b7)\\s*10\\s*\\^)/,/^(?:\\^)/,/^(?:\\*)/,/^(?:[0-9]+\\.[0-9]+)/,/^(?:[0-9]+)/,/^(?:-)/,/^(?:\\u00b0( ?)[cCfF])/,/^(?:fl\\.? oz\\.?)/,/^(?:[\\u00b5]?([A-Za-z-]+|[\\u2103\\u2109\\u212b]))/,/^(?:\\s+)/,/^(?:$)/],\nconditions: {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\nexport const unitParser = parser;\n","// This is a @generated file\nimport _ from \"underscore\";\n\n/* parser generated by jison 0.4.15 */\n/*\n Returns a Parser object of the following structure:\n\n Parser: {\n yy: {}\n }\n\n Parser.prototype: {\n yy: {},\n trace: function(),\n symbols_: {associative list: name ==> number},\n terminals_: {associative list: number ==> name},\n productions_: [...],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n table: [...],\n defaultActions: {...},\n parseError: function(str, hash),\n parse: function(input),\n\n lexer: {\n EOF: 1,\n parseError: function(str, hash),\n setInput: function(input),\n input: function(),\n unput: function(str),\n more: function(),\n less: function(n),\n pastInput: function(),\n upcomingInput: function(),\n showPosition: function(),\n test_match: function(regex_match_array, rule_index),\n next: function(),\n lex: function(),\n begin: function(condition),\n popState: function(),\n _currentRules: function(),\n topState: function(),\n pushState: function(condition),\n\n options: {\n ranges: boolean (optional: true ==> token location info will include a .range[] member)\n flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n },\n\n performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n rules: [...],\n conditions: {associative list: name ==> set},\n }\n }\n\n\n token location info (@$, _$, etc.): {\n first_line: n,\n last_line: n,\n first_column: n,\n last_column: n,\n range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)\n }\n\n\n the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n text: (matched text)\n token: (the produced terminal token, if any)\n line: (yylineno)\n }\n while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n loc: (yylloc)\n expected: (string describing the set of expected tokens)\n recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n }\n*/\nvar parser = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,7],$V1=[1,17],$V2=[1,13],$V3=[1,14],$V4=[1,15],$V5=[1,32],$V6=[1,22],$V7=[1,23],$V8=[1,24],$V9=[1,25],$Va=[1,26],$Vb=[1,33],$Vc=[1,27],$Vd=[1,28],$Ve=[1,29],$Vf=[1,30],$Vg=[1,20],$Vh=[1,36],$Vi=[1,37],$Vj=[5,6,8,10,33,35,41,43,45],$Vk=[1,39],$Vl=[1,40],$Vm=[5,6,8,10,12,14,16,19,21,22,28,29,30,31,32,33,34,35,37,39,41,42,43,44,45,46],$Vn=[10,16,19,21,22,28,29,30,31,32,34,37,39,42,43,44,46],$Vo=[5,6,8,10,12,14,16,18,19,21,22,28,29,30,31,32,33,34,35,37,39,41,42,43,44,45,46];\nvar parser = {trace: function trace () { },\nyy: {},\nsymbols_: {\"error\":2,\"equation\":3,\"expression\":4,\"SIGN\":5,\"EOF\":6,\"additive\":7,\"+\":8,\"multiplicative\":9,\"-\":10,\"triglog\":11,\"*\":12,\"negative\":13,\"/\":14,\"trig\":15,\"TRIG\":16,\"trigfunc\":17,\"^\":18,\"TRIGINV\":19,\"logbase\":20,\"ln\":21,\"log\":22,\"_\":23,\"subscriptable\":24,\"power\":25,\"primitive\":26,\"variable\":27,\"VAR\":28,\"CONST\":29,\"INT\":30,\"FLOAT\":31,\"{\":32,\"}\":33,\"(\":34,\")\":35,\"function\":36,\"FUNC\":37,\"invocation\":38,\"sqrt\":39,\"[\":40,\"]\":41,\"abs\":42,\"|\":43,\"LEFT|\":44,\"RIGHT|\":45,\"FRAC\":46,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",5:\"SIGN\",6:\"EOF\",8:\"+\",10:\"-\",12:\"*\",14:\"/\",16:\"TRIG\",18:\"^\",19:\"TRIGINV\",21:\"ln\",22:\"log\",23:\"_\",28:\"VAR\",29:\"CONST\",30:\"INT\",31:\"FLOAT\",32:\"{\",33:\"}\",34:\"(\",35:\")\",37:\"FUNC\",39:\"sqrt\",40:\"[\",41:\"]\",42:\"abs\",43:\"|\",44:\"LEFT|\",45:\"RIGHT|\",46:\"FRAC\"},\nproductions_: [0,[3,4],[3,2],[3,1],[4,1],[7,3],[7,3],[7,1],[9,2],[9,3],[9,3],[9,1],[13,2],[13,1],[15,1],[17,1],[17,3],[17,1],[20,1],[20,1],[20,3],[11,2],[11,2],[11,1],[25,3],[25,1],[27,1],[24,3],[24,1],[24,1],[24,1],[24,1],[24,3],[24,3],[36,1],[38,4],[38,4],[38,7],[38,4],[38,3],[38,3],[38,4],[26,1],[26,1],[26,7]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\nreturn new yy.Eq($$[$0-3], $$[$0-2], $$[$0-1]);\nbreak;\ncase 2:\nreturn $$[$0-1];\nbreak;\ncase 3:\nreturn new yy.Add([]);\nbreak;\ncase 4: case 7: case 11: case 13: case 15: case 20: case 23: case 25: case 42: case 43:\nthis.$ = $$[$0];\nbreak;\ncase 5:\nthis.$ = yy.Add.createOrAppend($$[$0-2], $$[$0]);\nbreak;\ncase 6:\nthis.$ = yy.Add.createOrAppend($$[$0-2], yy.Mul.handleNegative($$[$0], \"subtract\"));\nbreak;\ncase 8:\nthis.$ = yy.Mul.fold(yy.Mul.createOrAppend($$[$0-1], $$[$0]));\nbreak;\ncase 9:\nthis.$ = yy.Mul.fold(yy.Mul.createOrAppend($$[$0-2], $$[$0]));\nbreak;\ncase 10:\nthis.$ = yy.Mul.fold(yy.Mul.handleDivide($$[$0-2], $$[$0]));\nbreak;\ncase 12:\nthis.$ = yy.Mul.handleNegative($$[$0]);\nbreak;\ncase 14: case 17:\nthis.$ = [yytext];\nbreak;\ncase 16:\nthis.$ = $$[$0-2].concat($$[$0]);\nbreak;\ncase 18:\nthis.$ = yy.Log.natural();\nbreak;\ncase 19:\nthis.$ = yy.Log.common();\nbreak;\ncase 21:\nthis.$ = yy.Trig.create($$[$0-1], $$[$0]);\nbreak;\ncase 22:\nthis.$ = yy.Log.create($$[$0-1], $$[$0]);\nbreak;\ncase 24:\nthis.$ = new yy.Pow($$[$0-2], $$[$0]);\nbreak;\ncase 26: case 34:\nthis.$ = yytext;\nbreak;\ncase 27:\nthis.$ = new yy.Var($$[$0-2], $$[$0]);\nbreak;\ncase 28:\nthis.$ = new yy.Var($$[$0]);\nbreak;\ncase 29:\nthis.$ = new yy.Const(yytext.toLowerCase());\nbreak;\ncase 30:\nthis.$ = yy.Int.create(Number(yytext));\nbreak;\ncase 31:\nthis.$ = yy.Float.create(Number(yytext));\nbreak;\ncase 32:\nthis.$ = $$[$0-1].completeParse();\nbreak;\ncase 33:\nthis.$ = $$[$0-1].completeParse().addHint('parens');\nbreak;\ncase 35: case 36:\nthis.$ = yy.Pow.sqrt($$[$0-1]);\nbreak;\ncase 37:\nthis.$ = new yy.Pow.nthroot($$[$0-1], $$[$0-4]);\nbreak;\ncase 38: case 39: case 40:\nthis.$ = new yy.Abs($$[$0-1]);\nbreak;\ncase 41:\nthis.$ = new yy.Func($$[$0-3], $$[$0-1]);\nbreak;\ncase 44:\nthis.$ = yy.Mul.handleDivide($$[$0-4], $$[$0-1]);\nbreak;\n}\n},\ntable: [{3:1,4:2,6:[1,3],7:4,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{1:[3]},{5:[1,34],6:[1,35]},{1:[2,3]},o([5,6],[2,4],{8:$Vh,10:$Vi}),o($Vj,[2,7],{17:9,20:10,25:11,15:12,26:16,24:18,38:19,27:21,36:31,11:38,12:$Vk,14:$Vl,16:$V1,19:$V2,21:$V3,22:$V4,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,37:$Vb,39:$Vc,42:$Vd,44:$Vf,46:$Vg}),o($Vm,[2,11]),{10:$V0,11:8,13:41,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,13]),{10:$V0,11:8,13:42,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{10:$V0,11:8,13:43,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,23]),o($Vn,[2,15],{18:[1,44]}),o($Vn,[2,17]),o($Vn,[2,18]),o($Vn,[2,19],{23:[1,45]}),o($Vm,[2,25],{18:[1,46]}),o([10,16,18,19,21,22,28,29,30,31,32,34,37,39,42,43,44,46],[2,14]),o($Vo,[2,42]),o($Vo,[2,43]),{32:[1,47]},o($Vo,[2,28],{23:[1,48]}),o($Vo,[2,29]),o($Vo,[2,30]),o($Vo,[2,31]),{7:49,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:50,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{32:[1,52],34:[1,51],40:[1,53]},{34:[1,54]},{7:55,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:56,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{34:[1,57]},o([5,6,8,10,12,14,16,18,19,21,22,23,28,29,30,31,32,33,34,35,37,39,41,42,43,44,45,46],[2,26]),{34:[2,34]},{4:58,7:4,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{1:[2,2]},{9:59,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{9:60,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,8]),{10:$V0,11:8,13:61,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{10:$V0,11:8,13:62,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},o($Vm,[2,12]),o($Vm,[2,21]),o($Vm,[2,22]),{10:$V0,11:8,13:63,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{24:64,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va},{10:$V0,11:8,13:65,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:66,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{24:67,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va},{8:$Vh,10:$Vi,33:[1,68]},{8:$Vh,10:$Vi,35:[1,69]},{7:70,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:71,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:72,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:73,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{8:$Vh,10:$Vi,43:[1,74]},{8:$Vh,10:$Vi,45:[1,75]},{7:76,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{6:[1,77]},o($Vj,[2,5],{17:9,20:10,25:11,15:12,26:16,24:18,38:19,27:21,36:31,11:38,12:$Vk,14:$Vl,16:$V1,19:$V2,21:$V3,22:$V4,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,37:$Vb,39:$Vc,42:$Vd,44:$Vf,46:$Vg}),o($Vj,[2,6],{17:9,20:10,25:11,15:12,26:16,24:18,38:19,27:21,36:31,11:38,12:$Vk,14:$Vl,16:$V1,19:$V2,21:$V3,22:$V4,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,37:$Vb,39:$Vc,42:$Vd,44:$Vf,46:$Vg}),o($Vm,[2,9]),o($Vm,[2,10]),o($Vn,[2,16]),o($Vn,[2,20]),o($Vm,[2,24]),{8:$Vh,10:$Vi,33:[1,78]},o($Vo,[2,27]),o($Vo,[2,32]),o($Vo,[2,33]),{8:$Vh,10:$Vi,35:[1,79]},{8:$Vh,10:$Vi,33:[1,80]},{8:$Vh,10:$Vi,41:[1,81]},{8:$Vh,10:$Vi,35:[1,82]},o($Vo,[2,39]),o($Vo,[2,40]),{8:$Vh,10:$Vi,35:[1,83]},{1:[2,1]},{32:[1,84]},o($Vo,[2,35]),o($Vo,[2,36]),{32:[1,85]},o($Vo,[2,38]),o($Vo,[2,41]),{7:86,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{7:87,9:5,10:$V0,11:8,13:6,15:12,16:$V1,17:9,19:$V2,20:10,21:$V3,22:$V4,24:18,25:11,26:16,27:21,28:$V5,29:$V6,30:$V7,31:$V8,32:$V9,34:$Va,36:31,37:$Vb,38:19,39:$Vc,42:$Vd,43:$Ve,44:$Vf,46:$Vg},{8:$Vh,10:$Vi,33:[1,88]},{8:$Vh,10:$Vi,33:[1,89]},o($Vo,[2,44]),o($Vo,[2,37])],\ndefaultActions: {3:[2,3],33:[2,34],35:[2,2],77:[2,1]},\nparseError: function parseError (str, hash) {\n if (hash.recoverable) {\n this.trace(str);\n } else {\n throw new Error(str);\n }\n},\nparse: function parse(input) {\n var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n var args = lstack.slice.call(arguments, 1);\n var lexer = Object.create(this.lexer);\n var sharedState = { yy: {} };\n for (var k in this.yy) {\n if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n sharedState.yy[k] = this.yy[k];\n }\n }\n lexer.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer;\n sharedState.yy.parser = this;\n if (typeof lexer.yylloc == 'undefined') {\n lexer.yylloc = {};\n }\n var yyloc = lexer.yylloc;\n lstack.push(yyloc);\n var ranges = lexer.options && lexer.options.ranges;\n if (typeof sharedState.yy.parseError === 'function') {\n this.parseError = sharedState.yy.parseError;\n } else {\n this.parseError = Object.getPrototypeOf(this).parseError;\n }\n function popStack(n) {\n stack.length = stack.length - 2 * n;\n vstack.length = vstack.length - n;\n lstack.length = lstack.length - n;\n }\n //_token_stack:\n function lex() {\n var token;\n token = lexer.lex() || EOF;\n if (typeof token !== 'number') {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == 'undefined') {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === 'undefined' || !action.length || !action[0]) {\n var errStr = '';\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > TERROR) {\n expected.push('\\'' + this.terminals_[p] + '\\'');\n }\n }\n if (lexer.showPosition) {\n errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n } else {\n errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n }\n this.parseError(errStr, {\n text: lexer.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer.yylineno,\n loc: yyloc,\n expected: expected\n });\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(lexer.yytext);\n lstack.push(lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer.yyleng;\n yytext = lexer.yytext;\n yylineno = lexer.yylineno;\n yyloc = lexer.yylloc;\n if (recovering > 0) {\n recovering--;\n }\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = {\n first_line: lstack[lstack.length - (len || 1)].first_line,\n last_line: lstack[lstack.length - 1].last_line,\n first_column: lstack[lstack.length - (len || 1)].first_column,\n last_column: lstack[lstack.length - 1].last_column\n };\n if (ranges) {\n yyval._$.range = [\n lstack[lstack.length - (len || 1)].range[0],\n lstack[lstack.length - 1].range[1]\n ];\n }\n r = this.performAction.apply(yyval, [\n yytext,\n yyleng,\n yylineno,\n sharedState.yy,\n action[1],\n vstack,\n lstack\n ].concat(args));\n if (typeof r !== 'undefined') {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n this.yy = yy || this.yy || {};\n this._input = input;\n this._more = this._backtrack = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n };\n if (this.options.ranges) {\n this.yylloc.range = [0,0];\n }\n this.offset = 0;\n return this;\n },\n\n// consumes and returns one char from the input\ninput:function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) {\n this.yylloc.range[1]++;\n }\n\n this._input = this._input.slice(1);\n return ch;\n },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\n\n this.yylloc = {\n first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ?\n (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n + oldLines[oldLines.length - lines.length].length - lines[0].length :\n this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n this.yyleng = this.yytext.length;\n return this;\n },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n this._more = true;\n return this;\n },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n if (this.options.backtrack_lexer) {\n this._backtrack = true;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n\n }\n return this;\n },\n\n// retain first n characters of the match\nless:function (n) {\n this.unput(this.match.slice(n));\n },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20-next.length);\n }\n return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function(match, indexed_rule) {\n var token,\n lines,\n backup;\n\n if (this.options.backtrack_lexer) {\n // save context\n backup = {\n yylineno: this.yylineno,\n yylloc: {\n first_line: this.yylloc.first_line,\n last_line: this.last_line,\n first_column: this.yylloc.first_column,\n last_column: this.yylloc.last_column\n },\n yytext: this.yytext,\n match: this.match,\n matches: this.matches,\n matched: this.matched,\n yyleng: this.yyleng,\n offset: this.offset,\n _more: this._more,\n _input: this._input,\n yy: this.yy,\n conditionStack: this.conditionStack.slice(0),\n done: this.done\n };\n if (this.options.ranges) {\n backup.yylloc.range = this.yylloc.range.slice(0);\n }\n }\n\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno += lines.length;\n }\n this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ?\n lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n this.yylloc.last_column + match[0].length\n };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._backtrack = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) {\n this.done = false;\n }\n if (token) {\n return token;\n } else if (this._backtrack) {\n // recover context\n for (var k in backup) {\n this[k] = backup[k];\n }\n return false; // rule action called reject() implying the next rule should be tested instead.\n }\n return false;\n },\n\n// return next match in input\nnext:function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n\n var token,\n match,\n tempMatch,\n index;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (this.options.backtrack_lexer) {\n token = this.test_match(tempMatch, rules[i]);\n if (token !== false) {\n return token;\n } else if (this._backtrack) {\n match = false;\n continue; // rule action called reject() implying a rule MISmatch.\n } else {\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n } else if (!this.options.flex) {\n break;\n }\n }\n }\n if (match) {\n token = this.test_match(match, rules[index]);\n if (token !== false) {\n return token;\n }\n // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n return false;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n }\n },\n\n// return next match that has a token\nlex:function lex () {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin (condition) {\n this.conditionStack.push(condition);\n },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState () {\n var n = this.conditionStack.length - 1;\n if (n > 0) {\n return this.conditionStack.pop();\n } else {\n return this.conditionStack[0];\n }\n },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules () {\n if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n } else {\n return this.conditions[\"INITIAL\"].rules;\n }\n },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState (n) {\n n = this.conditionStack.length - 1 - Math.abs(n || 0);\n if (n >= 0) {\n return this.conditionStack[n];\n } else {\n return \"INITIAL\";\n }\n },\n\n// alias for begin(condition)\npushState:function pushState (condition) {\n this.begin(condition);\n },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n return this.conditionStack.length;\n },\noptions: {\"flex\":true},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:/* skip whitespace */\nbreak;\ncase 1:/* skip \\space */\nbreak;\ncase 2:/* skip '\\ ' */\nbreak;\ncase 3:return \"INT\"\nbreak;\ncase 4:return \"FLOAT\"\nbreak;\ncase 5:return \"^\"\nbreak;\ncase 6:return \"*\"\nbreak;\ncase 7:return \"*\"\nbreak;\ncase 8:return \"*\"\nbreak;\ncase 9:return \"*\"\nbreak;\ncase 10:return \"/\"\nbreak;\ncase 11:return \"/\"\nbreak;\ncase 12:return \"-\"\nbreak;\ncase 13:return \"-\"\nbreak;\ncase 14:return \"+\"\nbreak;\ncase 15:return \"^\"\nbreak;\ncase 16:return \"(\"\nbreak;\ncase 17:return \")\"\nbreak;\ncase 18:return \"(\"\nbreak;\ncase 19:return \")\"\nbreak;\ncase 20:return \"[\"\nbreak;\ncase 21:return \"]\"\nbreak;\ncase 22:return \"{\"\nbreak;\ncase 23:return \"}\"\nbreak;\ncase 24:return \"{\"\nbreak;\ncase 25:return \"}\"\nbreak;\ncase 26:return \"_\"\nbreak;\ncase 27:return \"|\"\nbreak;\ncase 28:return \"LEFT|\"\nbreak;\ncase 29:return \"RIGHT|\"\nbreak;\ncase 30:return \"!\"\nbreak;\ncase 31:return \"SIGN\"\nbreak;\ncase 32:yy_.yytext = \"<=\"; return \"SIGN\"\nbreak;\ncase 33:yy_.yytext = \">=\"; return \"SIGN\"\nbreak;\ncase 34:yy_.yytext = \"<=\"; return \"SIGN\"\nbreak;\ncase 35:yy_.yytext = \">=\"; return \"SIGN\"\nbreak;\ncase 36:yy_.yytext = \"<>\"; return \"SIGN\"\nbreak;\ncase 37:yy_.yytext = \"<>\"; return \"SIGN\"\nbreak;\ncase 38:yy_.yytext = \"<>\"; return \"SIGN\"\nbreak;\ncase 39:yy_.yytext = \"<>\"; return \"SIGN\"\nbreak;\ncase 40:yy_.yytext = \"<=\"; return \"SIGN\"\nbreak;\ncase 41:yy_.yytext = \">=\"; return \"SIGN\"\nbreak;\ncase 42:return \"FRAC\"\nbreak;\ncase 43:return \"FRAC\"\nbreak;\ncase 44:return \"sqrt\"\nbreak;\ncase 45:return \"abs\"\nbreak;\ncase 46:return \"ln\"\nbreak;\ncase 47:return \"log\"\nbreak;\ncase 48:return \"TRIG\"\nbreak;\ncase 49:return \"TRIG\"\nbreak;\ncase 50:return \"TRIG\"\nbreak;\ncase 51:return \"TRIG\"\nbreak;\ncase 52:yy_.yytext = \"sin\"; return \"TRIG\"\nbreak;\ncase 53:yy_.yytext = \"cos\"; return \"TRIG\"\nbreak;\ncase 54:yy_.yytext = \"tan\"; return \"TRIG\"\nbreak;\ncase 55:yy_.yytext = \"csc\"; return \"TRIG\"\nbreak;\ncase 56:yy_.yytext = \"sec\"; return \"TRIG\"\nbreak;\ncase 57:yy_.yytext = \"cot\"; return \"TRIG\"\nbreak;\ncase 58:yy_.yytext = \"arcsin\"; return \"TRIG\"\nbreak;\ncase 59:yy_.yytext = \"arccos\"; return \"TRIG\"\nbreak;\ncase 60:yy_.yytext = \"arctan\"; return \"TRIG\"\nbreak;\ncase 61:yy_.yytext = \"arccsc\"; return \"TRIG\"\nbreak;\ncase 62:yy_.yytext = \"arcsec\"; return \"TRIG\"\nbreak;\ncase 63:yy_.yytext = \"arccot\"; return \"TRIG\"\nbreak;\ncase 64:return \"TRIGINV\"\nbreak;\ncase 65:return \"TRIGINV\"\nbreak;\ncase 66:yy_.yytext = \"sinh\"; return \"TRIG\"\nbreak;\ncase 67:yy_.yytext = \"cosh\"; return \"TRIG\"\nbreak;\ncase 68:yy_.yytext = \"tanh\"; return \"TRIG\"\nbreak;\ncase 69:yy_.yytext = \"csch\"; return \"TRIG\"\nbreak;\ncase 70:yy_.yytext = \"sech\"; return \"TRIG\"\nbreak;\ncase 71:yy_.yytext = \"tanh\"; return \"TRIG\"\nbreak;\ncase 72:return \"CONST\"\nbreak;\ncase 73:yy_.yytext = \"pi\"; return \"CONST\"\nbreak;\ncase 74:yy_.yytext = \"pi\"; return \"CONST\"\nbreak;\ncase 75:return \"VAR\"\nbreak;\ncase 76:yy_.yytext = \"theta\"; return \"VAR\"\nbreak;\ncase 77:yy_.yytext = \"theta\"; return \"VAR\"\nbreak;\ncase 78:return \"VAR\"\nbreak;\ncase 79:yy_.yytext = \"phi\"; return \"VAR\"\nbreak;\ncase 80:yy_.yytext = \"phi\"; return \"VAR\"\nbreak;\ncase 81:return yy.symbolLexer(yy_.yytext)\nbreak;\ncase 82:return \"EOF\"\nbreak;\ncase 83:return \"INVALID\"\nbreak;\ncase 84:console.log(yy_.yytext);\nbreak;\n}\n},\nrules: [/^(?:\\s+)/,/^(?:\\\\space)/,/^(?:\\\\ )/,/^(?:[0-9]+\\.?)/,/^(?:([0-9]+)?\\.[0-9]+)/,/^(?:\\*\\*)/,/^(?:\\*)/,/^(?:\\\\cdot|·)/,/^(?:\\\\times|×)/,/^(?:\\\\ast)/,/^(?:\\/)/,/^(?:\\\\div|÷)/,/^(?:-)/,/^(?:−)/,/^(?:\\+)/,/^(?:\\^)/,/^(?:\\()/,/^(?:\\))/,/^(?:\\\\left\\()/,/^(?:\\\\right\\))/,/^(?:\\[)/,/^(?:\\])/,/^(?:\\{)/,/^(?:\\})/,/^(?:\\\\left\\{)/,/^(?:\\\\right\\})/,/^(?:_)/,/^(?:\\|)/,/^(?:\\\\left\\|)/,/^(?:\\\\right\\|)/,/^(?:\\!)/,/^(?:<=|>=|<>|<|>|=)/,/^(?:\\\\le)/,/^(?:\\\\ge)/,/^(?:\\\\leq)/,/^(?:\\\\geq)/,/^(?:=\\/=)/,/^(?:\\\\ne)/,/^(?:\\\\neq)/,/^(?:≠)/,/^(?:≤)/,/^(?:≥)/,/^(?:\\\\frac)/,/^(?:\\\\dfrac)/,/^(?:sqrt|\\\\sqrt)/,/^(?:abs|\\\\abs)/,/^(?:ln|\\\\ln)/,/^(?:log|\\\\log)/,/^(?:sin|cos|tan)/,/^(?:csc|sec|cot)/,/^(?:sinh|cosh|tanh)/,/^(?:csch|sech|coth)/,/^(?:\\\\sin)/,/^(?:\\\\cos)/,/^(?:\\\\tan)/,/^(?:\\\\csc)/,/^(?:\\\\sec)/,/^(?:\\\\cot)/,/^(?:\\\\arcsin)/,/^(?:\\\\arccos)/,/^(?:\\\\arctan)/,/^(?:\\\\arccsc)/,/^(?:\\\\arcsec)/,/^(?:\\\\arccot)/,/^(?:arcsin|arccos|arctan)/,/^(?:arccsc|arcsec|arccot)/,/^(?:\\\\sinh)/,/^(?:\\\\cosh)/,/^(?:\\\\tanh)/,/^(?:\\\\csch)/,/^(?:\\\\sech)/,/^(?:\\\\coth)/,/^(?:pi)/,/^(?:π)/,/^(?:\\\\pi)/,/^(?:theta)/,/^(?:θ)/,/^(?:\\\\theta)/,/^(?:phi)/,/^(?:φ)/,/^(?:\\\\phi)/,/^(?:[a-zA-Z])/,/^(?:$)/,/^(?:.)/,/^(?:.)/],\nconditions: {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\nexport {parser};\n","/* TODO(charlie): fix these lint errors (http://eslint.org/docs/rules): */\n/* eslint-disable indent, no-undef, no-var, one-var, no-dupe-keys, no-new-func, no-redeclare, no-unused-vars, comma-dangle, max-len, prefer-spread, space-infix-ops, space-unary-ops */\nimport _ from \"underscore\";\n\nimport {unitParser} from \"./__genfiles__/unitparser.js\";\nimport {parser} from \"./__genfiles__/parser.js\";\n\n/* The node hierarcy is as follows:\n\n (Expr)\n (Seq) 2+ children\n Add\n Mul\n Pow 2 children\n Log 2 children\n Eq 2 children\n Trig 1 child\n Abs 1 child\n (Symbol)\n Func 1 child e.g. f(x)\n Var leaf node e.g. x, x_n\n Const leaf node e.g. pi, e, <i>\n Unit leaf node e.g. kg\n (Num) leaf node\n Rational e.g. 2/3\n Int\n Float\n\n (abstract, not meant to be instantiated)\n\n == Key design concepts ==\n Functional: All methods return new nodes - nodes are never mutated.\n Ignore commutativity: Commutative inputs should be parsed equivalently.\n Exploit commutativity: Output should take advantage of ordering.\n*/\n\n/* non user-facing functions */\n\n// assert that all abstract methods have been overridden\nvar abstract = function() {\n // Try to give people a bit of information when this happens\n throw new Error(\"Abstract method - must override for expr: \" +\n this.print());\n};\n\n// throw an error that is meant to be caught by the test suite (not user facing)\nvar error = function(message) { throw new Error(message); };\n\n// reliably detect NaN\nvar isNaN = function(object) { return object !== object; };\n\n// return a random float between min (inclusive) and max (exclusive),\n// not that inclusivity means much, probabilistically, on floats\nvar randomFloat = function(min, max) {\n var extent = max - min;\n return Math.random() * extent + min;\n};\n\n/* constants */\nvar ITERATIONS = 12;\nvar TOLERANCE = 9; // decimal places\n\n\n/* abstract base expression node */\nfunction Expr() {}\n\n_.extend(Expr.prototype, {\n\n // this node's immediate constructor\n func: abstract,\n\n // an array of the arguments to this node's immediate constructor\n args: abstract,\n\n // make a new node with the given arguments\n construct: function(args) {\n var instance = new this.func();\n this.func.apply(instance, args);\n return instance;\n },\n\n // an abstraction for chainable, bottom-up recursion\n recurse: function(method) {\n var passed = Array.prototype.slice.call(arguments, 1);\n var args = _.map(this.args(), function(arg) {\n return _.isString(arg) ? arg : arg[method].apply(arg, passed);\n });\n return this.construct(args);\n },\n\n // evaluate numerically with given variable mapping\n eval: abstract,\n\n codegen: abstract,\n\n compile: function() {\n var code = this.codegen();\n try {\n return new Function(\"vars\", \"return \" + code + \";\");\n } catch (e) {\n throw new Error(\"Function did not compile: \" + code);\n }\n },\n\n // returns a string unambiguously representing the expression\n // should be valid as input\n // e.g. this.equals(parse(this.print())) === true\n print: abstract,\n\n // returns a TeX string representing the expression\n tex: abstract,\n\n // returns a TeX string, modified by the given options\n asTex: function(options) {\n\n options = options || {};\n _.defaults(options, {\n display: true,\n dynamic: true,\n times: false\n });\n\n var tex = this.tex();\n\n if (options.display) {\n tex = \"\\\\displaystyle \" + tex;\n }\n if (options.dynamic) {\n tex = tex.replace(/\\(/g, \"\\\\left(\");\n tex = tex.replace(/\\)/g, \"\\\\right)\");\n }\n if (options.times) {\n tex = tex.replace(/\\\\cdot/g, \"\\\\times\");\n }\n\n return tex;\n },\n\n // returns the name of this expression's constructor as a string\n // only used for testing and debugging (the ugly regex is for IE8)\n name: function() {\n if (this.func.name) {\n return this.func.name;\n } else {\n return this.func.toString().match(/^function\\s*([^\\s(]+)/)[1];\n }\n },\n\n // returns a string representing current node structure\n repr: function() {\n return this.name() + \"(\" + _.map(this.args(), function(arg) {\n return _.isString(arg) ? arg : arg.repr();\n }).join(\",\") + \")\";\n },\n\n // removes all negative signs\n strip: function() { return this.recurse(\"strip\"); },\n\n // canonically reorders all commutative elements\n normalize: function() { return this.recurse(\"normalize\"); },\n\n // expands the expression\n expand: function() { return this.recurse(\"expand\"); },\n\n // naively factors out like terms\n factor: function(options) { return this.recurse(\"factor\", options); },\n\n // collect all like terms\n collect: function(options) { return this.recurse(\"collect\", options); },\n\n // strict syntactic equality check\n equals: function(other) {\n return this.normalize().print() === other.normalize().print();\n },\n\n // expand and collect until the expression no longer changes\n simplify: function(options) {\n options = _.extend({\n once: false\n }, options);\n\n // Attempt to factor and collect\n var step1 = this.factor(options);\n var step2 = step1.collect(options);\n\n // Rollback if collect didn't do anything\n if (step1.equals(step2)) {\n step2 = this.collect(options);\n }\n\n // Attempt to expand and collect\n var step3 = step2.expand(options);\n var step4 = step3.collect(options);\n\n // Rollback if collect didn't do anything\n if (step3.equals(step4)) {\n step4 = step2.collect(options);\n }\n\n // One round of simplification complete\n var simplified = step4;\n\n if (options.once || this.equals(simplified)) {\n return simplified;\n } else {\n return simplified.simplify(options);\n }\n },\n\n // check whether this expression is simplified\n isSimplified: function() {\n return this.equals(this.simplify());\n },\n\n // return the child nodes of this node\n exprArgs: function() {\n return _.filter(this.args(), function(arg) {\n return arg instanceof Expr;\n });\n },\n\n // return the variables (function and non) within the expression\n getVars: function(excludeFunc) {\n return _.uniq(_.flatten(_.invoke(this.exprArgs(), \"getVars\", excludeFunc))).sort();\n },\n\n getConsts: function() {\n return _.uniq(_.flatten(_.invoke(this.exprArgs(), \"getConsts\"))).sort();\n },\n\n getUnits: function() {\n return _.flatten(_.invoke(this.exprArgs(), \"getUnits\"));\n },\n\n // check whether this expression node is of a particular type\n is: function(func) {\n return this instanceof func;\n },\n\n // check whether this expression has a particular node type\n has: function(func) {\n if (this instanceof func) {\n return true;\n }\n return _.any(this.exprArgs(), function(arg) { return arg.has(func); });\n },\n\n // raise this expression to a given exponent\n // most useful for eventually implementing i^3 = -i, etc.\n raiseToThe: function(exp) {\n return new Pow(this, exp);\n },\n\n // does this expression have a specific rendering hint?\n // rendering hints are picked up while parsing, but are lost during transformations\n isSubtract: function() { return false; },\n isDivide: function() { return false; },\n isRoot: function() { return false; },\n\n // whether this node needs an explicit multiplication sign if following a Num\n needsExplicitMul: function() {\n return this.args()[0].needsExplicitMul();\n },\n\n // check that the variables in both expressions are the same\n sameVars: function(other) {\n var vars1 = this.getVars();\n var vars2 = other.getVars();\n\n // the other Expr can have more variables than this one\n // this lets you multiply equations by other variables\n var same = function(array1, array2) {\n return !_.difference(array1, array2).length;\n };\n\n var lower = function(array) {\n return _.uniq(_.invoke(array, \"toLowerCase\")).sort();\n };\n\n var equal = same(vars1, vars2);\n var equalIgnoringCase = same(lower(vars1), lower(vars2));\n\n return {equal: equal, equalIgnoringCase: equalIgnoringCase};\n },\n\n // semantic equality check, call after sameVars() to avoid potential false positives\n // plug in random numbers for the variables in both expressions\n // if they both consistently evaluate the same, then they're the same\n compare: function(other) {\n // equation comparisons are handled by Eq.compare()\n if (other instanceof Eq) {\n return false;\n }\n\n var varList = _.union(\n this.getVars(/* excludeFunc */ true),\n other.getVars(/* excludeFunc */ true));\n\n // If the numbers are large we would like to do a relative comparison\n // rather than an absolute one, but if they're small enough then an\n // absolute comparison makes more sense\n var getDelta = function(num1, num2) {\n if (Math.abs(num1) < 1 || Math.abs(num2) < 1) {\n return Math.abs(num1 - num2);\n } else {\n return Math.abs(1 - num1 / num2);\n }\n };\n\n var equalNumbers = function(num1, num2) {\n var delta = getDelta(num1, num2);\n return ((num1 === num2) || /* needed if either is +/- Infinity */\n (isNaN(num1) && isNaN(num2)) ||\n (delta < Math.pow(10, -TOLERANCE)));\n };\n\n // if no variables, only need to evaluate once\n if (!varList.length && !this.has(Unit) && !other.has(Unit)) {\n return equalNumbers(this.eval(), other.eval());\n }\n\n // collect here to avoid sometimes dividing by zero, and sometimes not\n // it is better to be deterministic, e.g. x/x -> 1\n // TODO(alex): may want to keep track of assumptions as they're made\n var expr1 = this.collect();\n var expr2 = other.collect();\n\n var unitList1 = this.getUnits();\n var unitList2 = other.getUnits();\n\n if (!_.isEqual(unitList1, unitList2)) {\n return false;\n }\n\n // Compare at a set number (currently 12) of points to determine\n // equality.\n //\n // `range` (and `vars`) is the only variable that varies through the\n // iterations. For each of range = 10, 100, and 1000, each random\n // variable is picked from (-range, range).\n //\n // Note that because there are 12 iterations and three ranges, each\n // range is checked four times.\n for (var i = 0; i < ITERATIONS; i++) {\n\n var vars = {};\n\n // One third total iterations each with range 10, 100, and 1000\n var range = Math.pow(10, 1 + Math.floor(3 * i / ITERATIONS));\n\n // Half of the iterations should only use integer values.\n // This is because expressions like (-2)^x are common but result\n // in NaN when evaluated in JS with non-integer values of x.\n // Without this, (-2)^x and (-2)^(x+1) both end up always being NaN\n // and thus equivalent. With this, the most common failure case is\n // avoided. However, less common cases such as (-2)^(x+0.1) and\n // (-2)^(x+1.1) will still both evaluate to NaN and result in a\n // false positive.\n //\n // Note that the above is only true in vanilla JS Number-land,\n // which has no concept of complex numbers. The solution is simple:\n // Integrate a library for handling complex numbers.\n //\n // TODO(alex): Add support for complex numbers, then remove this.\n var useFloats = i % 2 === 0;\n\n _.each(varList, function(v) {\n vars[v] = useFloats ? randomFloat(-range, range)\n : _.random(-range, range);\n });\n\n var equal;\n if (expr1.has(Func) || expr2.has(Func) ||\n expr1.has(Unit) || expr2.has(Unit)) {\n\n var result1 = expr1.partialEval(vars);\n var result2 = expr2.partialEval(vars);\n\n equal = result1.simplify().equals(result2.simplify());\n } else {\n var result1 = expr1.eval(vars);\n var result2 = expr2.eval(vars);\n\n equal = equalNumbers(result1, result2);\n }\n\n if (!equal) {\n return false;\n }\n }\n\n return true;\n },\n\n // evaluate as much of the expression as possible\n partialEval: function(vars) {\n if (this instanceof Unit) {\n return this;\n } else if (!this.has(Func)) {\n return new Float(this.eval(vars).toFixed(TOLERANCE)).collect();\n } else if (this instanceof Func) {\n return new Func(this.symbol, this.arg.partialEval(vars));\n } else {\n return this.recurse(\"partialEval\", vars);\n }\n },\n\n // check that the structure of both expressions is the same\n // all negative signs are stripped and the expressions are converted to\n // a canonical commutative form\n // should only be done after compare() returns true to avoid false positives\n sameForm: function(other) {\n return this.strip().equals(other.strip());\n },\n\n // returns the GCD of this expression and the given factor\n findGCD: function(factor) {\n return this.equals(factor) ? factor : Num.One;\n },\n\n // return this expression's denominator\n getDenominator: function() {\n return Num.One;\n },\n\n // return this expression as a Mul\n asMul: function() {\n return new Mul(Num.One, this);\n },\n\n // TODO(alex): rename to isDefinitePositive or similar?\n // return whether this expression is 100% positive\n isPositive: abstract,\n\n // TODO(alex): rename to hasNegativeSign or similar?\n // return whether this expression has a negative sign\n isNegative: function() { return false; },\n\n // return a factor of this expression that is 100% positive\n asPositiveFactor: function() {\n return this.isPositive() ? this : Num.One;\n },\n\n // return a copy of the expression with a new hint set (preserves hints)\n addHint: function(hint) {\n if (!hint) {\n return this;\n }\n\n var expr = this.construct(this.args());\n expr.hints = _.clone(this.hints);\n expr.hints[hint] = true;\n return expr;\n },\n\n hints: {\n parens: false\n },\n\n // currently unused!\n asExpr: function() { return this; },\n\n // complete parse by performing a few necessary transformations\n completeParse: function() { return this.recurse(\"completeParse\"); },\n\n abs: abstract,\n\n negate: function() {\n return new Mul(Num.Neg, this);\n }\n});\n\n\n/* abstract sequence node */\nfunction Seq() {}\nSeq.prototype = new Expr();\n\n_.extend(Seq.prototype, {\n args: function() { return this.terms; },\n\n normalize: function() {\n var terms = _.sortBy(_.invoke(this.terms, \"normalize\"), function(term) {\n return term.print();\n });\n\n return new this.func(terms);\n },\n\n expand: function() {\n return this.recurse(\"expand\").flatten();\n },\n\n // partition the sequence into its numeric and non-numeric parts\n // makes no guarantees about the validity of either part!\n partition: function() {\n var terms = _.groupBy(this.terms, function(term) {\n return term instanceof Num;\n });\n\n // XXX using a boolean as a key just converts it to a string. I don't\n // think this code was written with that in mind. Probably doesn't\n // matter except for readability.\n var numbers = terms[true] || [];\n var others = terms[false] || [];\n\n return [new this.func(numbers), new this.func(others)];\n },\n\n // ensure that sequences have 2+ terms and no nested sequences of the same type\n // this is a shallow flattening and will return a non-Seq if terms.length <= 1\n flatten: function() {\n var type = this;\n var terms = _.reject(this.terms, function(term) {\n return term.equals(type.identity);\n });\n\n if (terms.length === 0) {\n return type.identity;\n }\n if (terms.length === 1) {\n return terms[0];\n }\n\n var grouped = _.groupBy(terms, function(term) {\n return term instanceof type.func;\n });\n\n // same contains the children which are Seqs of the same type as this Seq\n var same = grouped[true] || [];\n var others = grouped[false] || [];\n\n var flattened = others.concat(_.flatten(_.pluck(same, \"terms\"), /* shallow: */ true));\n return new type.func(flattened);\n },\n\n // the identity associated with the sequence\n identity: undefined,\n\n // reduce a numeric sequence to a Num\n reduce: abstract,\n\n isPositive: function() {\n var terms = _.invoke(this.terms, \"collect\");\n return _.all(_.invoke(terms, \"isPositive\"));\n },\n\n // return a new Seq with a given term replaced by a different term\n // (or array of terms). given term can be passed directly, or by index\n // if no new term is provided, the old one is simply removed\n replace: function(oldTerm, newTerm) {\n var index;\n\n if (oldTerm instanceof Expr) {\n index = _.indexOf(this.terms, oldTerm);\n } else {\n index = oldTerm;\n }\n\n var newTerms = [];\n if (_.isArray(newTerm)) {\n newTerms = newTerm;\n } else if (newTerm) {\n newTerms = [newTerm];\n }\n\n var terms = this.terms.slice(0, index)\n .concat(newTerms)\n .concat(this.terms.slice(index + 1));\n\n return new this.func(terms);\n },\n\n // syntactic sugar for replace()\n remove: function(term) {\n return this.replace(term);\n },\n\n getDenominator: function() {\n // TODO(alex): find and return LCM\n return new Mul(_.invoke(this.terms, \"getDenominator\")).flatten();\n }\n});\n\n\n/* sequence of additive terms */\nexport function Add() {\n if (arguments.length === 1) {\n this.terms = arguments[0];\n } else {\n this.terms = _.toArray(arguments);\n }\n}\nAdd.prototype = new Seq();\n\n_.extend(Add.prototype, {\n func: Add,\n\n eval: function(vars, options) {\n return _.reduce(this.terms, function(memo, term) { return memo + term.eval(vars, options); }, 0);\n },\n\n codegen: function() {\n return _.map(this.terms, function(term) {\n return \"(\" + term.codegen() + \")\";\n }).join(\" + \") || \"0\";\n },\n\n print: function() {\n return _.invoke(this.terms, \"print\").join(\"+\");\n },\n\n tex: function() {\n var tex = \"\";\n\n _.each(this.terms, function(term) {\n if (!tex || term.isSubtract()) {\n tex += term.tex();\n } else {\n tex += \"+\" + term.tex();\n }\n });\n\n return tex;\n },\n\n collect: function(options) {\n var terms = _.invoke(this.terms, \"collect\", options);\n\n // [Expr expr, Num coefficient]\n var pairs = [];\n\n _.each(terms, function(term) {\n if (term instanceof Mul) {\n var muls = term.partition();\n pairs.push([muls[1].flatten(), muls[0].reduce(options)]);\n } else if (term instanceof Num) {\n pairs.push([Num.One, term]);\n } else {\n pairs.push([term, Num.One]);\n }\n });\n\n // { (Expr expr).print(): [[Expr expr, Num coefficient]] }\n var grouped = _.groupBy(pairs, function(pair) {\n return pair[0].normalize().print();\n });\n\n var collected = _.compact(_.map(grouped, function(pairs) {\n var expr = pairs[0][0];\n var sum = new Add(_.zip.apply(_, pairs)[1]);\n var coefficient = sum.reduce(options);\n return new Mul(coefficient, expr).collect(options);\n }));\n\n // TODO(alex): use the Pythagorean identity here\n // e.g. x*sin^2(y) + x*cos^2(y) -> x\n\n return new Add(collected).flatten();\n },\n\n // naively factor out anything that is common to all terms\n // if options.keepNegative is specified, won't factor out a common -1\n factor: function(options) {\n options = _.extend({\n keepNegative: false\n }, options);\n\n var terms = _.invoke(this.terms, \"collect\");\n var factors;\n\n if (terms[0] instanceof Mul) {\n factors = terms[0].terms;\n } else {\n factors = [terms[0]];\n }\n\n _.each(_.rest(this.terms), function(term) {\n factors = _.map(factors, function(factor) {\n return term.findGCD(factor);\n });\n });\n\n if (!options.keepNegative && this.isNegative()) {\n factors.push(Num.Neg);\n }\n\n factors = new Mul(factors).flatten().collect();\n\n var remainder = _.map(terms, function(term) {\n return Mul.handleDivide(term, factors).simplify();\n });\n remainder = new Add(remainder).flatten();\n\n return Mul.createOrAppend(factors, remainder).flatten();\n },\n\n reduce: function(options) {\n return _.reduce(this.terms, function(memo, term) {\n return memo.add(term, options);\n }, this.identity);\n },\n\n needsExplicitMul: function() { return false; },\n\n isNegative: function() {\n var terms = _.invoke(this.terms, \"collect\");\n return _.all(_.invoke(terms, \"isNegative\"));\n },\n\n negate: function() {\n return new Add(_.invoke(this.terms, \"negate\"));\n }\n});\n\n\n/* sequence of multiplicative terms */\nexport function Mul() {\n if (arguments.length === 1) {\n this.terms = arguments[0];\n } else {\n this.terms = _.toArray(arguments);\n }\n}\nMul.prototype = new Seq();\n\n_.extend(Mul.prototype, {\n func: Mul,\n\n eval: function(vars, options) {\n return _.reduce(this.terms, function(memo, term) { return memo * term.eval(vars, options); }, 1);\n },\n\n codegen: function() {\n return _.map(this.terms, function(term) {\n return \"(\" + term.codegen() + \")\";\n }).join(\" * \") || \"0\";\n },\n\n print: function() {\n return _.map(this.terms, function(term) {\n return (term instanceof Add) ? \"(\" + term.print() + \")\" : term.print();\n }).join(\"*\");\n },\n\n getUnits: function() {\n var tmUnits = _(this.terms)\n .chain()\n .map(function(term) {\n return term.getUnits();\n })\n .flatten()\n .value();\n\n tmUnits.sort((a, b) => a.unit.localeCompare(b.unit));\n\n return tmUnits;\n },\n\n // since we don't care about commutativity, we can render a Mul any way we choose\n // so we follow convention: first any negatives, then any numbers, then everything else\n tex: function() {\n var cdot = \" \\\\cdot \";\n\n var terms = _.groupBy(this.terms, function(term) {\n if (term.isDivide()) {\n return \"inverse\";\n } else if (term instanceof Num) {\n return \"number\";\n } else {\n return \"other\";\n }\n });\n\n var inverses = terms.inverse || [];\n var numbers = terms.number || [];\n var others = terms.other || [];\n\n var negatives = \"\";\n var numerator;\n\n // check all the numbers to see if there is a rational we can extract,\n // since we would like 1/2x/y to come out as \\frac{1}{2}\\frac{x}{y},\n // and not \\frac{1x}{2y}.\n for (var i = 0; i < numbers.length; i++) {\n var isRational = numbers[i] instanceof Rational &&\n !(numbers[i] instanceof Int);\n if (isRational && others.length > 0 && inverses.length > 0) {\n var withThisRemoved = numbers.slice();\n withThisRemoved.splice(i, 1);\n var newTerms = withThisRemoved.concat(inverses).concat(others);\n return numbers[i].tex() + new Mul(newTerms).tex();\n }\n }\n\n numbers = _.compact(_.map(numbers, function(term) {\n var hasDenom = (term instanceof Rational) && !(term instanceof Int);\n var shouldPushDown = !term.hints.fraction || inverses.length > 0;\n if (hasDenom && shouldPushDown) {\n // e.g. 3x/4 -> 3/4*x (internally) -> 3x/4 (rendered)\n inverses.push(new Pow(new Int(term.d), Num.Div));\n var number = new Int(term.n);\n number.hints = term.hints;\n return _.any(term.hints) ? number : null;\n } else {\n return term;\n }\n }));\n\n if (numbers.length === 0 && others.length === 1) {\n // e.g. (x+y)/z -> \\frac{x+y}{z}\n numerator = others[0].tex();\n } else {\n var tex = \"\";\n\n _.each(numbers, function(term) {\n if (term.hints.subtract && term.hints.entered) {\n negatives += \"-\";\n tex += (tex ? cdot : \"\") + term.abs().tex();\n } else if ((term instanceof Int) && (term.n === -1) &&\n (term.hints.negate || term.hints.subtract)) {\n // e.g. -1*-1 -> --1\n // e.g. -1*x -> -x\n negatives += \"-\";\n } else {\n // e.g. 2*3 -> 2(dot)3\n tex += (tex ? cdot : \"\") + term.tex();\n }\n });\n\n _.each(others, function(term) {\n if (term.needsExplicitMul()) {\n // e.g. 2*2^3 -> 2(dot)2^3\n tex += (tex ? cdot : \"\") + term.tex();\n } else if (term instanceof Add) {\n // e.g. (a+b)*c -> (a+b)c\n tex += \"(\" + term.tex() + \")\";\n } else {\n // e.g. a*b*c -> abc\n tex += term.tex();\n }\n });\n\n numerator = tex ? tex : \"1\";\n }\n\n if (!inverses.length) {\n return negatives + numerator;\n } else {\n var denominator = new Mul(_.invoke(inverses, \"asDivide\")).flatten().tex();\n return negatives + \"\\\\frac{\" + numerator + \"}{\" + denominator + \"}\";\n }\n },\n\n strip: function() {\n var terms = _.map(this.terms, function(term) {\n return term instanceof Num ? term.abs() : term.strip();\n });\n return new Mul(terms).flatten();\n },\n\n // expand numerator and denominator separately\n expand: function() {\n\n var isAdd = function(term) {\n return term instanceof Add;\n };\n\n var isInverse = function(term) {\n return term instanceof Pow && term.exp.isNegative();\n };\n\n var isInverseAdd = function(term) {\n return isInverse(term) && isAdd(term.base);\n };\n\n var mul = this.recurse(\"expand\").flatten();\n\n var hasAdd = _.any(mul.terms, isAdd);\n var hasInverseAdd = _.any(mul.terms, isInverseAdd);\n\n if (!(hasAdd || hasInverseAdd)) {\n return mul;\n }\n\n var terms = _.groupBy(mul.terms, isInverse);\n var normals = terms[false] || [];\n var inverses = terms[true] || [];\n\n if (hasAdd) {\n var grouped = _.groupBy(normals, isAdd);\n var adds = grouped[true] || [];\n var others = grouped[false] || [];\n\n // loop over each additive sequence\n var expanded = _.reduce(adds, function(expanded, add) {\n // loop over each expanded array of terms\n return _.reduce(expanded, function(temp, array) {\n // loop over each additive sequence's terms\n return temp.concat(_.map(add.terms, function(term) {\n return array.concat(term);\n }));\n }, []);\n }, [[]]);\n\n // join each fully expanded array of factors with remaining multiplicative factors\n var muls = _.map(expanded, function(array) {\n return new Mul(others.concat(array)).flatten();\n });\n\n normals = [new Add(muls)];\n }\n\n if (hasInverseAdd) {\n var denominator = new Mul(_.invoke(inverses, \"getDenominator\")).flatten();\n inverses = [new Pow(denominator.expand(), Num.Div)];\n }\n\n return new Mul(normals.concat(inverses)).flatten();\n },\n\n factor: function(options) {\n var factored = this.recurse(\"factor\", options).flatten();\n if (! (factored instanceof Mul)) {\n return factored;\n }\n\n // Combine any factored out Rationals into one, but don't collect\n var grouped = _.groupBy(factored.terms, function(term) {\n return term instanceof Rational;\n });\n\n // Could also accomplish this by passing a new option\n // e.g. return memo.mul(term, {autocollect: false});\n // TODO(alex): Decide whether this is a good use of options or not\n var rational = _.reduce(grouped[true], function(memo, term) {\n return {n: memo.n * term.n, d: memo.d * term.d};\n }, {n: 1, d: 1});\n\n if (rational.d === 1) {\n rational = new Int(rational.n);\n } else {\n rational = new Rational(rational.n, rational.d);\n }\n\n return new Mul((grouped[false] || []).concat(rational)).flatten();\n },\n\n collect: function(options) {\n var partitioned = this.recurse(\"collect\", options).partition();\n var number = partitioned[0].reduce(options);\n\n // e.g. 0*x -> 0\n if (number.eval() === 0) {\n return Num.Zero;\n }\n\n var others = partitioned[1].flatten();\n\n // e.g. 2*2 -> 4\n // e.g. 2*2*x -> 4*x\n if (!(others instanceof Mul)) {\n return new Mul(number, others).flatten();\n }\n\n others = others.terms;\n\n // [Expr base, Expr exp]\n var pairs = [];\n\n _.each(others, function(term) {\n if (term instanceof Pow) {\n pairs.push([term.base, term.exp]);\n } else {\n pairs.push([term, Num.One]);\n }\n });\n\n // {(Expr base).print(): [[Expr base, Expr exp]]}\n var grouped = _.groupBy(pairs, function(pair) {\n return pair[0].normalize().print();\n });\n\n // [[Expr base, Expr exp]]\n var summed = _.compact(_.map(grouped, function(pairs) {\n var base = pairs[0][0];\n var sum = new Add(_.zip.apply(_, pairs)[1]);\n var exp = sum.collect(options);\n\n if (exp instanceof Num && exp.eval() === 0) {\n return null;\n } else {\n return [base, exp];\n }\n }));\n\n // XXX `pairs` is shadowed four or five times in this function\n var pairs = _.groupBy(summed, function(pair) {\n if (pair[0] instanceof Trig && pair[0].isBasic()) {\n return \"trig\";\n } else if (pair[0] instanceof Log) {\n return \"log\";\n } else {\n return \"expr\";\n }\n });\n var trigs = pairs.trig || [];\n var logs = pairs.log || [];\n var exprs = pairs.expr || [];\n\n if (trigs.length > 1) {\n // combine sines and cosines into other trig functions\n\n // {Trig.arg.print(): [[Trig base, Expr exp]]}\n var byArg = _.groupBy(trigs, function(pair) {\n return pair[0].arg.normalize().print();\n });\n\n trigs = [];\n _.each(byArg, function(pairs) {\n var arg = pairs[0][0].arg;\n\n // {Trig.type: Expr exp}\n var funcs = {sin: Num.Zero, cos: Num.Zero};\n _.each(pairs, function(pair) {\n funcs[pair[0].type] = pair[1];\n });\n\n if (Mul.handleNegative(funcs.sin).collect(options).equals(funcs.cos)) {\n // e.g. sin^x(y)/cos^x(y) -> tan^x(y)\n if (funcs.cos.isNegative()) {\n funcs = {tan: funcs.sin};\n } else {\n funcs = {cot: funcs.cos};\n }\n }\n\n // TODO(alex): combine even if exponents not a perfect match\n // TODO(alex): transform 1/sin and 1/cos into csc and sec\n\n _.each(funcs, function(exp, type) {\n trigs.push([new Trig(type, arg), exp]);\n });\n });\n }\n\n if (logs.length > 1) {\n // combine logs with the same base\n\n // {Log.base.print(): [[Log base, Expr exp]]}\n var byBase = _.groupBy(logs, function(pair) {\n return pair[0].base.normalize().print();\n });\n\n logs = [];\n\n _.each(byBase, function(pairs) {\n // only combine two logs of the same base, otherwise commutative\n // differences result in different equally valid output\n // e.g. ln(x)/ln(z)*ln(y) -> log_z(x)*ln(y)\n // e.g. ln(x)*ln(y)/ln(z) -> ln(x)*log_z(y)\n if (pairs.length === 2 &&\n Mul.handleNegative(pairs[0][1]).collect(options).equals(pairs[1][1])) {\n // e.g. ln(x)^y/ln(b)^y -> log_b(x)^y\n if (pairs[0][1].isNegative()) {\n logs.push([new Log(pairs[0][0].power, pairs[1][0].power), pairs[1][1]]);\n } else {\n logs.push([new Log(pairs[1][0].power, pairs[0][0].power), pairs[0][1]]);\n }\n } else {\n logs = logs.concat(pairs);\n }\n });\n\n // TODO(alex): combine if all inverses are the same e.g. ln(y)*ln(z)/ln(x)/ln(x)\n }\n\n pairs = trigs.concat(logs).concat(exprs);\n\n var collected = _.map(pairs, function(pair) {\n return new Pow(pair[0], pair[1]).collect(options);\n });\n\n return new Mul([number].concat(collected)).flatten();\n },\n\n isSubtract: function() {\n return _.any(this.terms, function(term) {\n return term instanceof Num && term.hints.subtract;\n });\n },\n\n // factor a single -1 in to the Mul\n // combine with a Num if all Nums are positive, else add as a term\n factorIn: function(hint) {\n var partitioned = this.partition();\n var numbers = partitioned[0].terms;\n var fold = numbers.length && _.all(numbers, function(num) {\n return num.n > 0;\n });\n\n if (fold) {\n // e.g. - x*2*3 -> x*-2*3\n var num = numbers[0].negate();\n num.hints = numbers[0].hints;\n return this.replace(numbers[0], num.addHint(hint));\n } else {\n // e.g. - x*y -> -1*x*y\n // e.g. - x*-2 -> -1*x*-2\n return new Mul([Num.negativeOne(hint)].concat(this.terms));\n }\n },\n\n // factor out a single hinted -1 (assume it is the division hint)\n // TODO(alex): make more general or rename to be more specific\n factorOut: function() {\n var factored = false;\n var terms = _.compact(_.map(this.terms, function(term, i, list) {\n if (!factored && term instanceof Num && term.hints.divide) {\n factored = true;\n return term.n !== -1 ? term.negate() : null;\n } else {\n return term;\n }\n }));\n\n if (terms.length === 1) {\n return terms[0];\n } else {\n return new Mul(terms);\n }\n },\n\n reduce: function(options) {\n return _.reduce(this.terms, function(memo, term) {\n return memo.mul(term, options);\n }, this.identity);\n },\n\n findGCD: function(factor) {\n return new Mul(_.invoke(this.terms, \"findGCD\", factor)).flatten();\n },\n\n asMul: function() {\n return this;\n },\n\n asPositiveFactor: function() {\n if (this.isPositive()) {\n return this;\n } else {\n var terms = _.invoke(this.collect().terms, \"asPositiveFactor\");\n return new Mul(terms).flatten();\n }\n },\n\n isNegative: function() {\n return _.any(_.invoke(this.collect().terms, \"isNegative\"));\n },\n\n fold: function() {\n return Mul.fold(this);\n },\n\n negate: function() {\n var isNum = function(expr) { return expr instanceof Num; };\n if (_.any(this.terms, isNum)) {\n var num = _.find(this.terms, isNum);\n return this.replace(num, num.negate());\n } else {\n return new Mul([Num.Neg].concat(this.terms));\n }\n }\n});\n\n// static methods for the sequence types\n_.each([Add, Mul], function(type) {\n _.extend(type, {\n // create a new sequence unless left is already one (returns a copy)\n createOrAppend: function(left, right) {\n if (left instanceof type) {\n return new type(left.terms.concat(right));\n } else {\n return new type(left, right);\n }\n }\n });\n});\n\n_.extend(Mul, {\n // negative signs should be folded into numbers whenever possible\n // never fold into a Num that's already negative or a Mul that has a negative Num\n // an optional hint is kept track of to properly render user input\n // an empty hint means negation\n handleNegative: function(expr, hint) {\n if (expr instanceof Num && expr.n > 0) {\n // e.g. - 2 -> -2\n var negated = expr.negate();\n // TODO(alex): rework hint system so that this isn't necessary\n negated.hints = expr.hints;\n return negated.addHint(hint);\n } else if (expr instanceof Mul) {\n // e.g. - x*2*3 -> x*-2*3\n // e.g. - x*y -> -1*x*y\n // e.g. - x*-2 -> -1*x*-2\n return expr.factorIn(hint);\n } else {\n // e.g. - x -> -1*x\n return new Mul(Num.negativeOne(hint), expr);\n }\n },\n\n // division can create either a Rational or a Mul\n handleDivide: function(left, right) {\n\n // dividing by a Mul is the same as repeated division by its terms\n if (right instanceof Mul) {\n var first = Mul.handleDivide(left, right.terms[0]);\n var rest = new Mul(_.rest(right.terms)).flatten();\n return Mul.handleDivide(first, rest);\n }\n\n var isInt = function(expr) { return expr instanceof Int; };\n var isRational = function(expr) { return expr instanceof Rational; };\n\n // for simplification purposes, fold Ints into Rationals if possible\n // e.g. 3x / 4 -> 3/4 * x (will still render as 3x/4)\n if (isInt(right) && left instanceof Mul && _.any(left.terms, isInt)) {\n\n // search from the right\n var reversed = left.terms.slice().reverse();\n var num = _.find(reversed, isRational);\n\n if (!isInt(num)) {\n return new Mul(left.terms.concat([new Rational(1, right.n).addHint(\"fraction\")]));\n }\n\n var rational = new Rational(num.n, right.n);\n rational.hints = num.hints;\n\n // in the case of something like 1/3 * 6/8, we want the\n // 6/8 to be considered a fraction, not just a division\n if (num === reversed[0]) {\n rational = rational.addHint(\"fraction\");\n }\n\n var result;\n if (num.n < 0 && right.n < 0) {\n rational.d = -rational.d;\n return left.replace(num, [Num.Neg, rational]);\n } else {\n return left.replace(num, rational);\n }\n }\n\n var divide = function(a, b) {\n if (b instanceof Int) {\n if (a instanceof Int) {\n if (a.n < 0 && b.n < 0) {\n // e.g. -2 / -3 -> -1*-2/3\n return [Num.Neg, new Rational(a.n, -b.n).addHint(\"fraction\")];\n } else {\n // e.g. 2 / 3 -> 2/3\n // e.g. -2 / 3 -> -2/3\n // e.g. 2 / -3 -> -2/3\n return [new Rational(a.n, b.n).addHint(\"fraction\")];\n }\n } else {\n // e.g. x / 3 -> x*1/3\n // e.g. x / -3 -> x*-1/3\n var inverse = new Rational(1, b.eval());\n if (b.eval() < 0) {\n return [a, inverse.addHint(\"negate\")];\n } else {\n return [a, inverse];\n }\n }\n } else {\n var pow;\n\n if (b instanceof Trig && b.exp) {\n // e.g. sin^2(x) -> sin(x)^2\n var exp = b.exp;\n b.exp = undefined;\n b = new Pow(b, exp);\n }\n\n if (b instanceof Pow) {\n // e.g. (x^2) ^ -1 -> x^-2\n // e.g. (x^y) ^ -1 -> x^(-1*y)\n // e.g. (x^(yz)) ^ -1 -> x^(-1*y*z)\n pow = new Pow(b.base, Mul.handleNegative(b.exp, \"divide\"));\n } else {\n // e.g. x ^ -1 -> x^-1\n pow = new Pow(b, Num.Div);\n }\n\n if (a instanceof Int && a.n === 1) {\n // e.g. 1 / x -> x^-1\n return [pow];\n } else {\n // e.g. 2 / x -> 2*x^-1\n return [a, pow];\n }\n }\n };\n\n if (left instanceof Mul) {\n var divided = divide(_.last(left.terms), right);\n return new Mul(_.initial(left.terms).concat(divided));\n } else {\n var divided = divide(left, right);\n return new Mul(divided).flatten();\n }\n },\n\n // fold negative signs into numbers if possible\n // negative signs are not the same as multiplying by negative one!\n // e.g. -x -> -1*x simplified\n // e.g. -2*x -> -2*x simplified\n // e.g. -x*2 -> -1*x*2 not simplified -> x*-2 simplified\n // e.g. -1*x*2 -> -1*x*2 not simplified\n\n // also fold multiplicative terms into open Trig and Log nodes\n // e.g. (sin x)*x -> sin(x)*x\n // e.g. sin(x)*x -> sin(x)*x\n // e.g. sin(x)*(x) -> sin(x)*x\n // e.g. sin(x)*sin(y) -> sin(x)*sin(y)\n fold: function(expr) {\n if (expr instanceof Mul) {\n // assuming that this will be second to last\n var trigLog = _.find(_.initial(expr.terms), function(term) {\n return (term instanceof Trig || term instanceof Log) && term.hints.open;\n });\n var index = _.indexOf(expr.terms, trigLog);\n\n if (trigLog) {\n var last = _.last(expr.terms);\n if (trigLog.hints.parens || last.hints.parens ||\n last.has(Trig) || last.has(Log)) {\n trigLog.hints.open = false;\n } else {\n var newTrigLog;\n if (trigLog instanceof Trig) {\n newTrigLog = Trig.create([trigLog.type, trigLog.exp], Mul.createOrAppend(trigLog.arg, last).fold());\n } else {\n newTrigLog = Log.create(trigLog.base, Mul.createOrAppend(trigLog.power, last).fold());\n }\n\n if (index === 0) {\n return newTrigLog;\n } else {\n return new Mul(expr.terms.slice(0, index).concat(newTrigLog)).fold();\n }\n }\n }\n\n var partitioned = expr.partition();\n var numbers = partitioned[0].terms;\n\n var pos = function(num) { return num.n > 0; };\n var neg = function(num) { return num.n === -1 && num.hints.negate; };\n var posOrNeg = function(num) { return pos(num) || neg(num); };\n\n if (numbers.length > 1 &&\n _.some(numbers, neg) &&\n _.some(numbers, pos) &&\n _.every(numbers, posOrNeg)) {\n\n var firstNeg = _.indexOf(expr.terms, _.find(expr.terms, neg));\n var firstNum = _.indexOf(expr.terms, _.find(expr.terms, pos));\n\n // e.g. -x*2 -> x*-2\n if (firstNeg < firstNum) {\n return expr.replace(firstNum,\n expr.terms[firstNum].negate())\n .remove(firstNeg);\n }\n }\n }\n\n // in all other cases, make no change\n return expr;\n }\n});\n\n\n/* exponentiation */\nexport function Pow(base, exp) { this.base = base; this.exp = exp; }\nPow.prototype = new Expr();\n\n_.extend(Pow.prototype, {\n func: Pow,\n args: function() { return [this.base, this.exp]; },\n\n eval: function(vars, options) {\n var evaledBase = this.base.eval(vars, options);\n var evaledExp = this.exp.eval(vars, options);\n\n // Math.pow unequivocally returns NaN when provided with both a\n // negative base and a fractional exponent. However, in some cases, we\n // know that our exponent is actually valid for use with negative\n // bases (e.g., (-5)^(1/3)).\n //\n // Here, we explicitly check for such cases. We really only handle a\n // limited subset (by requiring that the exponent is rational with an\n // odd denominator), but it's still useful.\n // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow\n if (evaledBase < 0) {\n var simplifiedExp = this.exp.simplify();\n\n // If Float, convert to a Rational to enable the logic below\n if (simplifiedExp instanceof Float) {\n var num = simplifiedExp.n;\n var decimals = (num - num.toFixed()).toString().length - 2;\n var denominator = Math.pow(10, decimals);\n var rationalExp = new Rational(num * denominator, denominator);\n simplifiedExp = rationalExp.simplify();\n }\n if (simplifiedExp instanceof Rational) {\n var oddDenominator = Math.abs(simplifiedExp.d) % 2 === 1;\n if (oddDenominator) {\n var oddNumerator = Math.abs(simplifiedExp.n) % 2 === 1;\n var sign = (oddNumerator) ? -1 : 1;\n return sign * Math.pow(-1 * evaledBase, evaledExp);\n }\n }\n }\n return Math.pow(evaledBase, evaledExp);\n },\n\n getUnits: function() {\n return this.base.getUnits().map(function(unit) {\n return {\n unit: unit.unit,\n pow: unit.pow * this.exp.n\n };\n }.bind(this));\n },\n\n codegen: function() {\n return \"Math.pow(\" + this.base.codegen() +\n \", \" + this.exp.codegen() + \")\";\n },\n\n print: function() {\n var base = this.base.print();\n if (this.base instanceof Seq || this.base instanceof Pow) {\n base = \"(\" + base + \")\";\n }\n return base + \"^(\" + this.exp.print() + \")\";\n },\n\n tex: function() {\n if (this.isDivide()) {\n\n // e.g. x ^ -1 w/hint -> 1/x\n return \"\\\\frac{1}{\" + this.asDivide().tex() + \"}\";\n\n } else if (this.isRoot()) {\n\n if (this.exp.n !== 1) {\n error(\"Node marked with hint 'root' does not have exponent \" +\n \"of form 1/x.\");\n }\n\n if (this.exp.d === 2) {\n // e.g. x ^ 1/2 w/hint -> sqrt{x}\n return \"\\\\sqrt{\" + this.base.tex() + \"}\";\n } else {\n // e.g. x ^ 1/y w/hint -> sqrt[y]{x}\n return \"\\\\sqrt[\" + this.exp.d + \"]{\" + this.base.tex() + \"}\";\n }\n\n } else if (this.base instanceof Trig && !this.base.isInverse() &&\n this.exp instanceof Num && this.exp.isSimple() &&\n this.exp.eval() >= 0) {\n\n // e.g sin(x) ^ 2 -> sin^2(x)\n var split = this.base.tex({split: true});\n return split[0] + \"^{\" + this.exp.tex() + \"}\" + split[1];\n\n } else {\n\n // e.g. x ^ y -> x^y\n var base = this.base.tex();\n if (this.base instanceof Seq || this.base instanceof Pow ||\n (this.base instanceof Num && !this.base.isSimple())) {\n // e.g. a+b ^ c -> (a+b)^c\n base = \"(\" + base + \")\";\n } else if (this.base instanceof Trig || this.base instanceof Log) {\n // e.g. ln(x) ^ 2 -> [ln(x)]^2\n base = \"[\" + base + \"]\";\n }\n return base + \"^{\" + this.exp.tex() + \"}\";\n }\n },\n\n needsExplicitMul: function() {\n return this.isRoot() ? false : this.base.needsExplicitMul();\n },\n\n expand: function() {\n var pow = this.recurse(\"expand\");\n\n if (pow.base instanceof Mul) {\n // e.g. (ab)^c -> a^c*b^c\n\n var terms = _.map(pow.base.terms, function(term) {\n return new Pow(term, pow.exp);\n });\n\n return new Mul(terms).expand();\n\n } else if (pow.base instanceof Add && pow.exp instanceof Int && pow.exp.abs().eval() > 1) {\n // e.g. (a+b)^2 -> a*a+a*b+a*b+b*b\n // e.g. (a+b)^-2 -> (a*a+a*b+a*b+b*b)^-1\n\n var positive = pow.exp.eval() > 0;\n var n = pow.exp.abs().eval();\n\n var signed = function(mul) {\n return positive ? mul : new Pow(mul, Num.Div);\n };\n\n // compute and cache powers of 2 up to n\n var cache = { 1: pow.base };\n for (var i = 2; i <= n; i *= 2) {\n var mul = new Mul(cache[i / 2], cache[i / 2]);\n cache[i] = mul.expand().collect();\n }\n\n // if n is a power of 2, you're done!\n if (_.has(cache, n)) {\n return signed(cache[n]);\n }\n\n // otherwise decompose n into powers of 2 ...\n var indices = _.map(n.toString(2).split(\"\"), function(str, i, list) {\n return Number(str) * Math.pow(2, list.length - i - 1);\n });\n indices = _.without(indices, 0);\n\n // ... then combine\n var mul = new Mul(_.pick(cache, indices)).expand().collect();\n return signed(mul);\n\n } else if (pow.exp instanceof Add) { // DEFINITELY want behind super-simplify() flag\n // e.g. x^(a+b) -> x^a*x^b\n\n var terms = _.map(pow.exp.terms, function(term) {\n return new Pow(pow.base, term).expand();\n });\n\n return new Mul(terms).expand();\n } else {\n return pow;\n }\n },\n\n factor: function() {\n var pow = this.recurse(\"factor\");\n if (pow.base instanceof Mul) {\n var terms = _.map(pow.base.terms, function(term) {\n if (term instanceof Int && pow.exp.equals(Num.Div)) {\n // Anything that can be a Rational should be a Rational\n // e.g. 2^(-1) -> 1/2\n return new Rational(1, term.n);\n } else {\n return new Pow(term, pow.exp);\n }\n });\n return new Mul(terms);\n } else {\n return pow;\n }\n },\n\n collect: function(options) {\n\n if (this.base instanceof Pow) {\n // collect this first to avoid having to deal with float precision\n // e.g. sqrt(2)^2 -> 2, not 2.0000000000000004\n // e.g. (x^y)^z -> x^(yz)\n var base = this.base.base;\n var exp = Mul.createOrAppend(this.base.exp, this.exp);\n return new Pow(base, exp).collect(options);\n }\n\n var pow = this.recurse(\"collect\", options);\n\n var isSimilarLog = function(term) {\n return term instanceof Log && term.base.equals(pow.base);\n };\n\n if (pow.exp instanceof Num &&\n pow.exp.eval() === 0) {\n\n // e.g. x^0 -> 1\n return Num.One;\n\n } else if (pow.exp instanceof Num &&\n pow.exp.eval() === 1) {\n\n // e.g. x^1 -> x\n return pow.base;\n\n } else if (isSimilarLog(pow.exp)) {\n\n // e.g. b^(log_b(x)) -> x\n return pow.exp.power;\n\n } else if (pow.exp instanceof Mul &&\n _.any(pow.exp.terms, isSimilarLog)) {\n\n // e.g. b^(2*y*log_b(x)) -> x^(2*y)\n var log = _.find(pow.exp.terms, isSimilarLog);\n var base = log.power;\n var exp = pow.exp.remove(log).flatten();\n return new Pow(base, exp).collect(options);\n\n } else if (pow.base instanceof Num &&\n pow.exp instanceof Num) {\n\n // TODO(alex): Consider encapsualting this logic (and similar logic\n // elsewhere) into a separate Decimal class for user-entered floats\n if (options && options.preciseFloats) {\n // Avoid creating an imprecise float\n // e.g. 23^1.5 -> 12167^0.5, not ~110.304\n\n // If you take the root as specified by the denominator and\n // end up with more digits after the decimal point,\n // the result is imprecise. This works for rationals as well\n // as floats, but ideally rationals should be pre-processed\n // e.g. (1/27)^(1/3) -> 1/3 to avoid most cases.\n // TODO(alex): Catch such cases and avoid converting to floats.\n var exp = pow.exp.asRational();\n var decimalsInBase = pow.base.getDecimalPlaces();\n var root = new Pow(pow.base, new Rational(1, exp.d));\n var decimalsInRoot = root.collect().getDecimalPlaces();\n\n if (decimalsInRoot > decimalsInBase) {\n // Collecting over this denominator would result in an\n // imprecise float, so avoid doing so.\n var newBase = new Pow(pow.base, new Int(exp.n)).collect();\n return new Pow(newBase, new Rational(1, exp.d));\n }\n }\n\n // e.g. 4^1.5 -> 8\n return pow.base.raiseToThe(pow.exp, options);\n } else {\n return pow;\n }\n },\n\n // checks whether this Pow represents user-entered division\n isDivide: function() {\n var isDiv = function(arg) { return arg instanceof Num && arg.hints.divide; };\n return isDiv(this.exp) || (this.exp instanceof Mul && _.any(this.exp.terms, isDiv));\n },\n\n // assuming this Pow represents user-entered division, returns the denominator\n asDivide: function() {\n if (this.exp instanceof Num) {\n if (this.exp.eval() === -1) {\n return this.base;\n } else {\n var negated = this.exp.negate();\n negated.hints = _.clone(this.exp.hints);\n negated.hints.divide = false;\n return new Pow(this.base, negated);\n }\n } else if (this.exp instanceof Mul) {\n return new Pow(this.base, this.exp.factorOut());\n } else {\n error(\"called asDivide() on an Expr that wasn't a Num or Mul\");\n }\n },\n\n isRoot: function() {\n return this.exp instanceof Rational && this.exp.hints.root;\n },\n\n isSquaredTrig: function() {\n return this.base instanceof Trig && !this.base.isInverse() &&\n this.exp instanceof Num && this.exp.eval() === 2;\n },\n\n // extract whatever denominator makes sense, ignoring hints\n // if negative exponent, will recursively include the base's denominator as well\n getDenominator: function() {\n if (this.exp instanceof Num && this.exp.eval() === -1) {\n return Mul.createOrAppend(this.base, this.base.getDenominator()).flatten();\n } else if (this.exp.isNegative()) {\n var pow = new Pow(this.base, Mul.handleNegative(this.exp).collect());\n return Mul.createOrAppend(pow, pow.collect().getDenominator()).flatten();\n } else if (this.base instanceof Num) {\n return new Pow(this.base.getDenominator(), this.exp).collect();\n } else {\n return Num.One;\n }\n },\n\n findGCD: function(factor) {\n var base, exp;\n if (factor instanceof Pow) {\n base = factor.base;\n exp = factor.exp;\n } else {\n base = factor;\n exp = Num.One;\n }\n\n // GCD is only relevant if same base\n if (this.base.equals(base)) {\n if (this.exp.equals(exp)) {\n // exact match\n // e.g. GCD(x^y^z, x^y^z) -> x^y^z\n return this;\n } else if (this.exp instanceof Num && exp instanceof Num) {\n // two numerical exponents\n // e.g. GCD(x^3, x^2) -> x^2\n return new Pow(this.base, Num.min(this.exp, exp)).collect();\n } else if (this.exp instanceof Num || exp instanceof Num) {\n // one numerical exponent\n // e.g. GCD(x^2, x^y) -> 1\n return Num.One;\n }\n\n var expA = this.exp.asMul().partition();\n var expB = exp.asMul().partition();\n\n if (expA[1].equals(expB[1])) {\n // exponents match except for coefficient\n // e.g. GCD(x^3y, x^y) -> x^y\n var coefficient = Num.min(expA[0].reduce(), expB[0].reduce());\n var mul = new Mul(coefficient, expA[1].flatten()).flatten();\n return new Pow(base, mul).collect();\n }\n }\n\n return Num.One;\n },\n\n isPositive: function() {\n if (this.base.isPositive()) {\n return true;\n }\n\n var exp = this.exp.simplify();\n return exp instanceof Int && exp.eval() % 2 === 0;\n },\n\n asPositiveFactor: function() {\n if (this.isPositive()) {\n return this;\n } else {\n var exp = this.exp.simplify();\n if (exp instanceof Int) {\n var n = exp.eval();\n if (n > 2) {\n // e.g. x^3 -> x^2\n return new Pow(this.base, new Int(n-1));\n } else if (n < -2) {\n // e.g. x^-3 -> x^-2\n return new Pow(this.base, new Int(n+1));\n }\n }\n return Num.One;\n }\n }\n});\n\n_.extend(Pow, {\n sqrt: function(arg) {\n return new Pow(arg, Num.Sqrt);\n },\n\n nthroot: function(radicand, degree) {\n var exp = Mul.fold(Mul.handleDivide(new Int(1), degree));\n\n // FIXME(johnsullivan): If oneOverDegree ends up being a pow object,\n // this \"root\" hint is lost between here and when tex() is called.\n return new Pow(radicand, exp.addHint(\"root\"));\n },\n});\n\n\n/* logarithm */\nexport function Log(base, power) { this.base = base; this.power = power; }\nLog.prototype = new Expr();\n\n_.extend(Log.prototype, {\n func: Log,\n args: function() { return [this.base, this.power]; },\n\n eval: function(vars, options) {\n return Math.log(this.power.eval(vars, options)) / Math.log(this.base.eval(vars, options));\n },\n\n codegen: function() {\n return \"(Math.log(\" + this.power.codegen() +\n \") / Math.log(\" + this.base.codegen() + \"))\";\n },\n\n print: function() {\n var power = \"(\" + this.power.print() + \")\";\n if (this.isNatural()) {\n return \"ln\" + power;\n } else {\n return \"log_(\" + this.base.print() + \") \" + power;\n }\n },\n\n tex: function() {\n var power = \"(\" + this.power.tex() + \")\";\n if (this.isNatural()) {\n return \"\\\\ln\" + power;\n } else {\n return \"\\\\log_{\" + this.base.tex() + \"}\" + power;\n }\n },\n\n collect: function(options) {\n var log = this.recurse(\"collect\", options);\n\n if (log.power instanceof Num && log.power.eval() === 1) {\n\n // e.g. ln(1) -> 0\n return Num.Zero;\n\n } else if (log.base.equals(log.power)) {\n\n // e.g. log_b(b) -> 1\n return Num.One;\n\n } else if (log.power instanceof Pow &&\n log.power.base.equals(log.base)) {\n\n // e.g. log_b(b^x) -> x\n return log.power.exp;\n } else {\n return log;\n }\n },\n\n expand: function() {\n var log = this.recurse(\"expand\");\n\n if (log.power instanceof Mul) { // might want behind super-simplify() flag\n // e.g. ln(xy) -> ln(x) + ln(y)\n\n var terms = _.map(log.power.terms, function(term) {\n // need to expand again in case new log powers are Pows\n return new Log(log.base, term).expand();\n });\n\n return new Add(terms);\n\n } else if (log.power instanceof Pow) {\n // e.g. ln(x^y) -> y*ln(x)\n\n return new Mul(log.power.exp, new Log(log.base, log.power.base).expand()).flatten();\n } else if (!log.isNatural()) {\n // e.g. log_b(x) -> ln(x)/ln(b)\n\n return Mul.handleDivide(new Log(Const.e, log.power), new Log(Const.e, log.base));\n } else {\n return log;\n }\n },\n\n hints: _.extend(Log.prototype.hints, {\n open: false\n }),\n\n isPositive: function() {\n var log = this.collect();\n\n if (log.base instanceof Num &&\n log.power instanceof Num) {\n return this.eval() > 0;\n } else {\n return false;\n }\n },\n\n needsExplicitMul: function() { return false; },\n\n isNatural: function() { return this.base.equals(Const.e); }\n});\n\n_.extend(Log, {\n natural: function() { return Const.e; },\n common: function() { return Num.Ten; },\n\n create: function(base, power) {\n var log = new Log(base, power);\n if (!power.hints.parens) {\n log = log.addHint(\"open\");\n }\n return log;\n }\n});\n\n\n/* trigonometric functions */\nexport function Trig(type, arg) { this.type = type; this.arg = arg; }\nTrig.prototype = new Expr();\n\n_.extend(Trig.prototype, {\n func: Trig,\n args: function() { return [this.type, this.arg]; },\n\n functions: {\n sin: {\n eval: Math.sin,\n codegen: \"Math.sin((\",\n tex: \"\\\\sin\",\n expand: function() { return this; }\n },\n cos: {\n eval: Math.cos,\n codegen: \"Math.cos((\",\n tex: \"\\\\cos\",\n expand: function() { return this; }\n },\n tan: {\n eval: Math.tan,\n codegen: \"Math.tan((\",\n tex: \"\\\\tan\",\n expand: function() {\n return Mul.handleDivide(Trig.sin(this.arg), Trig.cos(this.arg));\n }\n },\n csc: {\n eval: function(arg) { return 1 / Math.sin(arg); },\n codegen: \"(1/Math.sin(\",\n tex: \"\\\\csc\",\n expand: function() {\n return Mul.handleDivide(Num.One, Trig.sin(this.arg));\n }\n },\n sec: {\n eval: function(arg) { return 1 / Math.cos(arg); },\n codegen: \"(1/Math.cos(\",\n tex: \"\\\\sec\",\n expand: function() {\n return Mul.handleDivide(Num.One, Trig.cos(this.arg));\n }\n },\n cot: {\n eval: function(arg) { return 1 / Math.tan(arg); },\n codegen: \"(1/Math.tan(\",\n tex: \"\\\\cot\",\n expand: function() {\n return Mul.handleDivide(Trig.cos(this.arg), Trig.sin(this.arg));\n }\n },\n arcsin: {\n eval: Math.asin,\n codegen: \"Math.asin((\",\n tex: \"\\\\arcsin\"\n },\n arccos: {\n eval: Math.acos,\n codegen: \"Math.acos((\",\n tex: \"\\\\arccos\"\n },\n arctan: {\n eval: Math.atan,\n codegen: \"Math.atan((\",\n tex: \"\\\\arctan\"\n },\n arccsc: {\n eval: function(arg) { return Math.asin(1 / arg); },\n codegen: \"Math.asin(1/(\",\n tex: \"\\\\operatorname{arccsc}\"\n },\n arcsec: {\n eval: function(arg) { return Math.acos(1 / arg); },\n codegen: \"Math.acos(1/(\",\n tex: \"\\\\operatorname{arcsec}\"\n },\n arccot: {\n eval: function(arg) { return Math.atan(1 / arg); },\n codegen: \"Math.atan(1/(\",\n tex: \"\\\\operatorname{arccot}\"\n },\n sinh: {\n eval: function(arg) {\n return (Math.exp(arg) - Math.exp(-arg)) / 2;\n },\n codegen: function(argStr) {\n return \"((Math.exp(\" + argStr + \") - Math.exp(-(\" + argStr + \"))) / 2)\";\n },\n tex: \"\\\\sinh\",\n expand: function() { return this; }\n },\n cosh: {\n eval: function(arg) {\n return (Math.exp(arg) + Math.exp(-arg)) / 2;\n },\n codegen: function(argStr) {\n return \"((Math.exp(\" + argStr + \") + Math.exp(-(\" + argStr + \"))) / 2)\";\n },\n tex: \"\\\\cosh\",\n expand: function() { return this; }\n },\n tanh: {\n eval: function(arg) {\n return (Math.exp(arg) - Math.exp(-arg)) / (Math.exp(arg) + Math.exp(-arg));\n },\n codegen: function(argStr) {\n return \"(\" +\n \"(Math.exp(\" + argStr + \") - Math.exp(-(\" + argStr + \")))\" +\n \" / \" +\n \"(Math.exp(\" + argStr + \") + Math.exp(-(\" + argStr + \")))\" +\n \")\";\n },\n tex: \"\\\\tanh\",\n expand: function() {\n return Mul.handleDivide(Trig.sinh(this.arg), Trig.cosh(this.arg));\n }\n },\n csch: {\n eval: function(arg) { return 2 / (Math.exp(arg) - Math.exp(-arg)); },\n codegen: function(argStr) {\n return \"(2 / (Math.exp(\" + argStr + \") - Math.exp(-(\" + argStr + \"))))\";\n },\n tex: \"\\\\csch\",\n expand: function() {\n return Mul.handleDivide(Num.One, Trig.sinh(this.arg));\n }\n },\n sech: {\n eval: function(arg) { return 2 / (Math.exp(arg) + Math.exp(-arg)); },\n codegen: function(argStr) {\n return \"(2 / (Math.exp(\" + argStr + \") + Math.exp(-(\" + argStr + \"))))\";\n },\n tex: \"\\\\sech\",\n expand: function() {\n return Mul.handleDivide(Num.One, Trig.cosh(this.arg));\n }\n },\n coth: {\n eval: function(arg) {\n return (Math.exp(arg) + Math.exp(-arg)) / (Math.exp(arg) - Math.exp(-arg));\n },\n codegen: function(argStr) {\n return \"(\" +\n \"(Math.exp(\" + argStr + \") + Math.exp(-(\" + argStr + \")))\" +\n \" / \" +\n \"(Math.exp(\" + argStr + \") - Math.exp(-(\" + argStr + \")))\" +\n \")\";\n },\n tex: \"\\\\coth\",\n expand: function() {\n return Mul.handleDivide(Trig.cosh(this.arg), Trig.sinh(this.arg));\n }\n },\n },\n\n isEven: function() {\n return _.contains([\"cos\", \"sec\"], this.type);\n },\n\n isInverse: function() {\n return this.type.indexOf(\"arc\") === 0;\n },\n\n isBasic: function() {\n return _.contains([\"sin\", \"cos\"], this.type);\n },\n\n eval: function(vars, options) {\n var func = this.functions[this.type].eval;\n var arg = this.arg.eval(vars, options);\n return func(arg);\n },\n\n codegen: function() {\n var func = this.functions[this.type].codegen;\n if (typeof func === \"function\") {\n return func(this.arg.codegen());\n } else if (typeof func === \"string\") {\n return func + this.arg.codegen() + \"))\";\n } else {\n throw new Error(\"codegen not implemented for \" + this.type);\n }\n },\n\n print: function() {\n return this.type + \"(\" + this.arg.print() + \")\";\n },\n\n tex: function(options) {\n var func = this.functions[this.type].tex;\n var arg = \"(\" + this.arg.tex() + \")\";\n return (options && options.split) ? [func, arg] : func + arg;\n },\n\n hints: _.extend(Trig.prototype.hints, {\n open: false\n }),\n\n isPositive: function() {\n var trig = this.collect();\n\n if (trig.arg instanceof Num) {\n return this.eval() > 0;\n } else {\n return false;\n }\n },\n\n completeParse: function() {\n if (this.exp) {\n var pow = new Pow(this, this.exp);\n this.exp = undefined;\n return pow;\n } else {\n return this;\n }\n },\n\n // TODO(alex): does every new node type need to redefine these?\n needsExplicitMul: function() { return false; },\n\n expand: function() {\n var trig = this.recurse(\"expand\");\n if (!trig.isInverse()) {\n // e.g. tan(x) -> sin(x)/cos(x)\n var expand = trig.functions[trig.type].expand;\n return _.bind(expand, trig)();\n } else {\n return trig;\n }\n },\n\n collect: function(options) {\n var trig = this.recurse(\"collect\", options);\n if (!trig.isInverse() && trig.arg.isNegative()) {\n var arg;\n if (trig.arg instanceof Num) {\n arg = trig.arg.abs();\n } else {\n arg = Mul.handleDivide(trig.arg, Num.Neg).collect(options);\n }\n\n if (trig.isEven()) {\n // e.g. cos(-x) -> cos(x)\n return new Trig(trig.type, arg);\n\n } else {\n // e.g. sin(-x) -> -sin(x)\n return new Mul(Num.Neg, new Trig(trig.type, arg));\n }\n } else {\n return trig;\n }\n }\n});\n\n_.extend(Trig, {\n create: function(pair, arg) {\n var type = pair[0];\n var exp = pair[1];\n\n if (exp && exp.equals(Num.Neg)) {\n // e.g. sin^-1(x) -> arcsin(x)\n type = \"arc\" + type;\n exp = undefined;\n }\n\n var trig = new Trig(type, arg);\n if (!arg.hints.parens) {\n trig = trig.addHint(\"open\");\n }\n\n if (exp) {\n trig.exp = exp;\n }\n\n return trig;\n },\n\n sin: function(arg) {\n return new Trig(\"sin\", arg);\n },\n\n cos: function(arg) {\n return new Trig(\"cos\", arg);\n },\n\n sinh: function(arg) {\n return new Trig(\"sinh\", arg);\n },\n\n cosh: function(arg) {\n return new Trig(\"cosh\", arg);\n }\n});\n\n\nexport function Abs(arg) { this.arg = arg; }\nAbs.prototype = new Expr();\n\n_.extend(Abs.prototype, {\n func: Abs,\n args: function() { return [this.arg]; },\n eval: function(vars, options) { return Math.abs(this.arg.eval(vars, options)); },\n codegen: function() { return \"Math.abs(\" + this.arg.codegen() + \")\"; },\n print: function() { return \"abs(\" + this.arg.print() + \")\"; },\n\n tex: function() {\n return \"\\\\left|\" + this.arg.tex() + \"\\\\right|\";\n },\n\n collect: function(options) {\n var abs = this.recurse(\"collect\", options);\n\n if (abs.arg.isPositive()) {\n // e.g. |2^x| -> 2^x\n return abs.arg;\n } else if (abs.arg instanceof Num) {\n // e.g. |-2| -> 2\n return abs.arg.abs();\n } else if (abs.arg instanceof Mul) {\n // e.g. |-2*pi*x| -> 2*pi*|x|\n var terms = _.groupBy(abs.arg.terms, function(term) {\n if (term.isPositive()) {\n return \"positive\";\n } else if (term instanceof Num) {\n return \"number\";\n } else {\n return \"other\";\n }\n });\n\n var positives = terms.positive.concat(_.invoke(terms.number, \"abs\"));\n\n if (terms.other.length) {\n positives.push(new Abs(new Mul(terms.other).flatten()));\n }\n\n return new Mul(positives).flatten();\n } else {\n return abs;\n }\n },\n\n // this should definitely be behind a super-simplify flag\n expand: function() {\n var abs = this.recurse(\"expand\");\n\n if (abs.arg instanceof Mul) {\n // e.g. |xyz| -> |x|*|y|*|z|\n var terms = _.map(abs.arg.terms, function(term) {\n return new Abs(term);\n });\n return new Mul(terms);\n } else {\n return abs;\n }\n },\n\n isPositive: function() { return true; }\n});\n\n\n/* equation */\nexport function Eq(left, type, right) {\n this.left = left;\n this.type = type;\n this.right = right;\n}\nEq.prototype = new Expr();\n\n_.extend(Eq.prototype, {\n func: Eq,\n args: function() { return [this.left, this.type, this.right]; },\n\n needsExplicitMul: function() { return false; },\n\n print: function() {\n return this.left.print() + this.type + this.right.print();\n },\n\n signs: {\n \"=\": \" = \",\n \"<\": \" < \",\n \">\": \" > \",\n \"<>\": \" \\\\ne \",\n \"<=\": \" \\\\le \",\n \">=\": \" \\\\ge \"\n },\n\n tex: function() {\n return this.left.tex() + this.signs[this.type] + this.right.tex();\n },\n\n normalize: function() {\n var eq = this.recurse(\"normalize\");\n\n if (_.contains([\">\", \">=\"], eq.type)) {\n // inequalities should have the smaller side on the left\n return new Eq(eq.right, eq.type.replace(\">\", \"<\"), eq.left);\n } else {\n return eq;\n }\n },\n\n // convert this equation to an expression set to zero\n // the expression is normalized to a canonical form\n // e.g. y/2=x/4 -> y/2-x/4(=0) -> 2y-x(=0)\n // unless unfactored is specified, will then divide through\n asExpr: function(unfactored) {\n var isZero = function(expr) {\n return expr instanceof Num && expr.isSimple() && expr.eval() === 0;\n };\n\n // first convert to a sequence of additive terms\n var terms = [];\n\n if (this.left instanceof Add) {\n terms = _.clone(this.left.terms);\n } else if (!isZero(this.left)) {\n terms = [this.left];\n }\n\n if (this.right instanceof Add) {\n terms = terms.concat(this.right.negate().terms);\n } else if (!isZero(this.right)) {\n terms.push(this.right.negate());\n }\n\n var isInequality = !this.isEquality();\n\n // Collect over each term individually to transform simple expressions\n // into numbers that might have denominators, taking into account\n // float precision. We have to be very careful to not introduce any\n // irrational floats before asExpr() returns, because by definition\n // they do not have exact denominators...\n terms = _.invoke(terms, \"collect\", {preciseFloats: true});\n\n // ...and we multiply through by every denominator.\n for (var i = 0; i < terms.length; i++) {\n var denominator = terms[i].getDenominator();\n\n // Can't multiply inequalities by non 100% positive factors\n if (isInequality && !denominator.isPositive()) {\n denominator = denominator.asPositiveFactor();\n }\n\n if (!denominator.equals(Num.One)) {\n terms = _.map(terms, function(term) {\n return Mul.createOrAppend(term, denominator).simplify({\n once: true,\n preciseFloats: true\n });\n });\n }\n }\n\n var add = new Add(terms).flatten();\n return unfactored ? add : this.divideThrough(add);\n },\n\n // divide through by every common factor in the expression\n // e.g. 2y-4x(=0) -> y-2x(=0)\n // TODO(alex): Make it an option to only divide by variables/expressions\n // guaranteed to be nonzero\n divideThrough: function(expr) {\n var isInequality = !this.isEquality();\n\n var simplified = expr.simplify({once: true});\n var factored = simplified.factor({keepNegative: isInequality});\n\n if (!(factored instanceof Mul)) {\n return expr;\n }\n\n var terms = factored.terms;\n\n var isAdd = function(term) { return term instanceof Add; };\n var hasVar = function(term) { return !!term.getVars().length; };\n var isOne = function(term) { return term.equals(Num.One); };\n\n var grouped = _.groupBy(terms, isAdd);\n var adds = grouped[true] || [];\n var others = grouped[false] || [];\n\n if (adds.length && this.isEquality()) {\n // keep only Adds\n // e.g. 2xy(z+1)(=0) -> z+1(=0)\n return new Mul(adds).flatten();\n }\n\n var denominator = others;\n\n if (!adds.length) {\n // if no Adds, keep all variable terms to preserve meaning\n // e.g. 42xyz(=0) -> xyz(=0)\n denominator = _.reject(denominator, hasVar);\n }\n\n if (isInequality) {\n // can't divide inequalities by non 100% positive factors\n // e.g. 42x^2y(z+1)(=0) -> y(z+1)(=0)\n denominator = _.invoke(denominator, \"asPositiveFactor\");\n }\n\n // don't need to divide by one\n denominator = _.reject(denominator, isOne);\n\n denominator = _.map(denominator, function(term) {\n return new Pow(term, Num.Div);\n });\n\n var dividedResult = new Mul(terms.concat(denominator)).collect();\n\n // If the end result is the same as the original factoring,\n // rollback the factoring and discard all intermediate steps.\n if (dividedResult.equals(factored)) {\n return simplified;\n } else {\n return dividedResult;\n }\n },\n\n isEquality: function() {\n return _.contains([\"=\", \"<>\"], this.type);\n },\n\n compare: function(other) {\n // expression comparisons are handled by Expr.compare()\n if (!(other instanceof Eq)) {\n return false;\n }\n\n var eq1 = this.normalize();\n var eq2 = other.normalize();\n\n if (eq1.type !== eq2.type) {\n return false;\n }\n\n // need to collect to properly factor out common factors\n // e.g x+2x=6 -> 3x=6 -> 3x-6(=0) -> x-2(=0)\n var expr1 = eq1.divideThrough(eq1.asExpr(/* unfactored */ true).collect());\n var expr2 = eq2.divideThrough(eq2.asExpr(/* unfactored */ true).collect());\n\n if (eq1.isEquality()) {\n // equals and not-equals can be subtracted either way\n return expr1.compare(expr2) ||\n expr1.compare(Mul.handleNegative(expr2));\n } else {\n return expr1.compare(expr2);\n }\n },\n\n // should only be done after compare() returns true to avoid false positives\n sameForm: function(other) {\n var eq1 = this.normalize();\n var eq2 = other.normalize();\n\n var same = eq1.left.sameForm(eq2.left) && eq1.right.sameForm(eq2.right);\n\n if (eq1.isEquality()) {\n // equals and not-equals can be commutative with respect to the sign\n return same || (eq1.left.sameForm(eq2.right) && eq1.right.sameForm(eq2.left));\n } else {\n return same;\n }\n },\n\n // we don't want to override collect because it would turn y=x into y-x(=0)\n // instead, we ask if the equation was in that form, would it be simplified?\n isSimplified: function() {\n var expr = this.asExpr(/* unfactored */ true);\n var simplified = this.divideThrough(expr).simplify();\n return expr.equals(simplified) &&\n this.left.isSimplified() &&\n this.right.isSimplified();\n }\n});\n\n_.extend(Eq.prototype, {\n // Assumptions: Expression is of the form a+bx, and we solve for x\n solveLinearEquationForVariable: function(variable) {\n var expr = this.asExpr();\n if (!expr.is(Add) || expr.terms.length !== 2) {\n throw new Error(\"Can only handle linear equations of the form \" +\n \"a + bx (= 0)\");\n }\n\n var hasVar = function(term) {\n return term.has(Var) && _.contains(term.getVars(), variable.symbol);\n };\n\n var a, b;\n\n if (hasVar(expr.terms[0])) {\n a = Mul.handleNegative(expr.terms[1]);\n b = Mul.handleDivide(expr.terms[0], variable);\n } else {\n a = Mul.handleNegative(expr.terms[0]);\n b = Mul.handleDivide(expr.terms[1], variable);\n }\n\n return Mul.handleDivide(a, b).simplify();\n }\n});\n\n\n/* abstract symbol node */\nfunction Symbol() {}\nSymbol.prototype = new Expr();\n\n_.extend(Symbol.prototype, {\n\n needsExplicitMul: function() { return false; },\n\n findGCD: function(factor) {\n if (factor instanceof Symbol || factor instanceof Num) {\n return this.equals(factor) ? this : Num.One;\n } else {\n return factor.findGCD(this);\n }\n }\n});\n\n\n/* function variable */\nexport function Func(symbol, arg) {\n this.symbol = symbol; this.arg = arg;\n}\nFunc.prototype = new Symbol();\n\n_.extend(Func.prototype, {\n func: Func,\n args: function() { return [this.symbol, this.arg]; },\n\n print: function() {\n return this.symbol + \"(\" + this.arg.print() + \")\";\n },\n\n tex: function() {\n return this.symbol + \"(\" + this.arg.tex() + \")\";\n },\n\n eval: function(vars, options) {\n var arg = this.arg;\n var func = vars[this.symbol];\n var newVars = _.extend(_.clone(vars), {\n x: arg.eval(vars, options)\n });\n var parsedFunc = parse(func, options);\n if (parsedFunc.parsed) {\n return parsedFunc.expr.eval(newVars, options);\n }\n // If parsedFunc isn't actually parsed, return its error\n return parsedFunc;\n },\n\n codegen: function() {\n return 'vars[\"' + this.symbol + '\"](' +\n this.arg.codegen() + ')';\n },\n\n getUnits: function() {\n return this.arg.getUnits();\n },\n\n getVars: function(excludeFunc) {\n if (excludeFunc) {\n return this.arg.getVars();\n } else {\n return _.union(this.arg.getVars(), [this.symbol]).sort();\n }\n },\n\n getConsts: function() {\n return this.arg.getConsts();\n },\n});\n\n\n/* variable */\nexport function Var(symbol, subscript) {\n this.symbol = symbol;\n this.subscript = subscript;\n}\nVar.prototype = new Symbol();\n\n_.extend(Var.prototype, {\n func: Var,\n args: function() { return [this.symbol, this.subscript]; },\n\n exprArgs: function() { return []; },\n recurse: function() { return this; },\n\n print: function() {\n var sub = \"\";\n if (this.subscript) {\n sub = \"_(\" + this.subscript.print() + \")\";\n }\n return this.symbol + sub;\n },\n\n // Provide a way to easily evalate expressions with the common case,\n // subscripts that consist of a single number or symbol e.g. x_a or x_42\n prettyPrint: function() {\n var sub = this.subscript;\n if (sub && (sub instanceof Num || sub instanceof Symbol)) {\n return this.symbol + \"_\" + sub.print();\n } else {\n return this.print();\n }\n },\n\n tex: function() {\n var sub = \"\";\n if (this.subscript) {\n sub = \"_{\" + this.subscript.tex() + \"}\";\n }\n var prefix = this.symbol.length > 1 ? \"\\\\\" : \"\";\n return prefix + this.symbol + sub;\n },\n\n repr: function() { return \"Var(\" + this.print() + \")\"; },\n\n eval: function(vars, options) {\n return vars[this.prettyPrint()];\n },\n\n codegen: function() {\n return 'vars[\"' + this.prettyPrint() + '\"]';\n },\n\n getVars: function() { return [this.prettyPrint()]; },\n\n isPositive: function() { return false; }\n});\n\n\n/* constant */\nexport function Const(symbol) { this.symbol = symbol; }\nConst.prototype = new Symbol();\n\n_.extend(Const.prototype, {\n func: Const,\n args: function() { return [this.symbol]; },\n recurse: function() { return this; },\n\n eval: function(vars, options) {\n if (this.symbol === \"pi\") {\n return Math.PI;\n } else if (this.symbol === \"e\") {\n return Math.E;\n }\n },\n\n codegen: function() {\n if (this.symbol === \"pi\") {\n return \"Math.PI\";\n } else if (this.symbol === \"e\") {\n return \"Math.E\";\n }\n },\n\n print: function() { return this.symbol; },\n\n tex: function() {\n if (this.symbol === \"pi\") {\n return \"\\\\pi \";\n } else if (this.symbol === \"e\") {\n return \"e\";\n }\n },\n\n isPositive: function() {\n return this.eval() > 0;\n },\n\n abs: function() {\n if (this.eval() > 0) {\n return this;\n } else {\n return Mul.handleNegative(this);\n }\n },\n\n getConsts: function() {\n return [this.print()];\n },\n});\n\nConst.e = new Const(\"e\");\nConst.pi = new Const(\"pi\");\n\n\n/* abstract number node */\nfunction Num() {}\nNum.prototype = new Expr();\n\n_.extend(Num.prototype, {\n repr: function() { return this.print(); },\n strip: function() { return this.abs(); },\n recurse: function() { return this; },\n codegen: function() { return this.print(); },\n\n // takes another Num and returns a new Num\n add: abstract,\n mul: abstract,\n\n // returns this Num's additive inverse\n negate: abstract,\n\n isSubtract: function() { return this.hints.subtract; },\n\n // return the absolute value of the number\n abs: abstract,\n\n needsExplicitMul: function() { return true; },\n\n findGCD: abstract,\n\n isPositive: function() {\n return this.eval() > 0;\n },\n\n isNegative: function() {\n return this.eval() < 0;\n },\n\n asPositiveFactor: function() {\n return this.isPositive() ? this : this.abs();\n },\n\n // hints for interpreting and rendering user input\n hints: _.extend(Num.prototype.hints, {\n negate: false,\n subtract: false,\n divide: false,\n root: false,\n fraction: false,\n entered: false\n }),\n\n // whether a number is considered simple (one term)\n // e.g. for reals, ints and floats are simple\n isSimple: abstract,\n\n // Based on http://stackoverflow.com/a/10454560/2571482\n getDecimalPlaces: function() {\n var match = (\"\" + this.n).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (match) {\n return Math.max(\n 0,\n // Number of digits right of decimal point\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation\n (match[2] ? +match[2] : 0)\n );\n } else {\n return 0;\n }\n },\n\n asRational: abstract\n});\n\n\n/* rational number (n: numerator, d: denominator) */\nexport function Rational(numerator, denominator) {\n var n = numerator; var d = denominator;\n if (d < 0) {\n n = -n; d = -d;\n }\n this.n = n; this.d = d;\n}\nRational.prototype = new Num();\n\n_.extend(Rational.prototype, {\n func: Rational,\n args: function() { return [this.n, this.d]; },\n eval: function() { return this.n / this.d; },\n\n print: function() {\n return this.n.toString() + \"/\" + this.d.toString();\n },\n\n tex: function() {\n var tex = \"\\\\frac{\" + Math.abs(this.n).toString() + \"}{\" + this.d.toString() + \"}\";\n return this.n < 0 ? \"-\" + tex : tex;\n },\n\n add: function(num, options) {\n if (num instanceof Rational) {\n return new Rational(this.n * num.d + this.d * num.n, this.d * num.d).collect();\n } else {\n return num.add(this, options);\n }\n },\n\n mul: function(num, options) {\n if (num instanceof Rational) {\n return new Rational(this.n * num.n, this.d * num.d).collect();\n } else {\n return num.mul(this, options);\n }\n },\n\n collect: function() {\n var gcd = Num.findGCD(this.n, this.d);\n\n var n = this.n / gcd;\n var d = this.d / gcd;\n\n if (d === 1) {\n return new Int(n);\n } else {\n return new Rational(n, d);\n }\n },\n\n negate: function() {\n return new Rational(-this.n, this.d);\n },\n\n abs: function() {\n return new Rational(Math.abs(this.n), this.d);\n },\n\n findGCD: function(factor) {\n // Attempt to factor out common numerators and denominators to return\n // a Rational instead of a Float\n if (factor instanceof Rational) {\n // For more background, see\n // http://math.stackexchange.com/questions/151081/gcd-of-rationals\n var numerator = Num.findGCD(this.n * factor.d, factor.n * this.d);\n var denominator = this.d * factor.d;\n // Create the rational, then call .collect() to simplify it\n return new Rational(numerator, denominator).collect();\n } else if (factor instanceof Int) {\n return new Rational(Num.findGCD(this.n, factor.n), this.d);\n } else {\n return factor.findGCD(this);\n }\n },\n\n // for now, assuming that exp is a Num\n raiseToThe: function(exp) {\n if (exp instanceof Int) {\n var positive = exp.eval() > 0;\n var abs = exp.abs().eval();\n var n = Math.pow(this.n, abs);\n var d = Math.pow(this.d, abs);\n if (positive) {\n return new Rational(n, d).collect();\n } else {\n return new Rational(d, n).collect();\n }\n } else {\n return new Float(this.eval()).raiseToThe(exp);\n }\n },\n\n getDenominator: function() {\n return new Int(this.d);\n },\n\n isSimple: function() { return false; },\n\n asRational: function() { return this; }\n});\n\n\n/* integer (n: numerator/number) */\nexport function Int(number) { this.n = number; }\nInt.prototype = new Rational(0, 1);\n\n_.extend(Int.prototype, {\n func: Int,\n args: function() { return [this.n]; },\n print: function() { return this.n.toString(); },\n tex: function() { return this.n.toString(); },\n negate: function() { return new Int(-this.n); },\n abs: function() { return new Int(Math.abs(this.n)); },\n isSimple: function() { return true; },\n findGCD: function(factor) {\n if (factor instanceof Int) {\n return new Int(Num.findGCD(this.n, factor.n));\n } else {\n return factor.findGCD(this);\n }\n }\n});\n\n_.extend(Int, {\n create: function(n) { return new Int(n).addHint(\"entered\"); }\n});\n\n/* float (n: number) */\nexport function Float(number) { this.n = number; }\nFloat.prototype = new Num();\n\n_.extend(Float.prototype, {\n func: Float,\n args: function() { return [this.n]; },\n eval: function() { return this.n; },\n\n // TODO(alex): when we internationalize number parsing/display\n // we should make sure to use the appropriate decimal mark here\n print: function() { return this.n.toString(); },\n tex: function() { return this.n.toString(); },\n\n add: function(num, options) {\n if (options && options.preciseFloats) {\n return Float.toDecimalPlaces(\n this.n + num.eval(),\n Math.max(this.getDecimalPlaces(), num.getDecimalPlaces())\n );\n } else {\n return new Float(this.n + num.eval()).collect();\n }\n },\n\n mul: function(num, options) {\n if (options && options.preciseFloats) {\n return Float.toDecimalPlaces(\n this.n * num.eval(),\n this.getDecimalPlaces() + num.getDecimalPlaces()\n );\n } else {\n return new Float(this.n * num.eval()).collect();\n }\n },\n\n collect: function() {\n // We used to simplify Floats to Ints here whenever possible, but no\n // longer do so in order to preserve significant figures.\n return this;\n },\n\n negate: function() { return new Float(-this.n); },\n abs: function() { return new Float(Math.abs(this.n)); },\n\n findGCD: function(factor) {\n if (factor instanceof Num) {\n return new Float(Num.findGCD(this.eval(), factor.eval())).collect();\n } else {\n return factor.findGCD(this);\n }\n },\n\n // for now, assuming that exp is a Num\n raiseToThe: function(exp, options) {\n if (options && options.preciseFloats &&\n exp instanceof Int && exp.n > 1) {\n return Float.toDecimalPlaces(\n new Pow(this, exp).eval(),\n this.getDecimalPlaces() * exp.n\n );\n } else {\n return new Float(new Pow(this, exp).eval()).collect();\n }\n },\n\n // only to be used on non-repeating decimals (e.g. user-provided)\n asRational: function() {\n var parts = this.n.toString().split(\".\");\n if (parts.length === 1) {\n return new Rational(this.n, 1);\n } else {\n var numerator = Number(parts.join(\"\"));\n var denominator = Math.pow(10, parts[1].length);\n return new Rational(numerator, denominator).collect();\n }\n },\n\n getDenominator: function() {\n return this.asRational().getDenominator();\n },\n\n isSimple: function() { return true; }\n});\n\n_.extend(Float, {\n create: function(n) { return new Float(n).addHint(\"entered\"); },\n\n // Account for floating point imprecision by explicitly controlling the\n // number of decimal places in common operations (e.g. +, *, ^)\n toDecimalPlaces: function(n, places) {\n return new Float(+n.toFixed(Math.min(places, 20))).collect();\n }\n});\n\n// static methods and fields that are best defined on Num\n_.extend(Num, {\n negativeOne: function(hint) {\n if (hint === \"subtract\") {\n return Num.Sub;\n } else if (hint === \"divide\") {\n return Num.Div;\n } else {\n return Num.Neg;\n }\n },\n\n // find the greatest common denominator\n findGCD: function(a, b) {\n var mod;\n\n a = Math.abs(a);\n b = Math.abs(b);\n\n // Euclid's method doesn't handle non-integers very well. For now\n // we just say we can't pull out a common factor. It might be\n // reasonable to do better than this in the future.\n if (a !== Math.floor(a) || b !== Math.floor(b)) {\n return 1;\n }\n\n while (b) {\n mod = a % b;\n a = b;\n b = mod;\n }\n\n return a;\n },\n\n min: function() {\n return _.min(_.toArray(arguments), function(num) {\n return num.eval();\n });\n },\n\n max: function() {\n return _.max(_.toArray(arguments), function(num) {\n return num.eval();\n });\n }\n});\n\nNum.Neg = new Int(-1).addHint(\"negate\");\nNum.Sub = new Int(-1).addHint(\"subtract\");\nNum.Div = new Int(-1).addHint(\"divide\");\n\nNum.Sqrt = new Rational(1, 2).addHint(\"root\");\n\nNum.Zero = new Int(0);\nNum.One = new Int(1);\nNum.Ten = new Int(10);\n\n\n// set identities here\nAdd.prototype.identity = Num.Zero;\nMul.prototype.identity = Num.One;\n\nvar parseError = function(str, hash) {\n // return int location of parsing error\n throw new Error(hash.loc.first_column);\n};\n\n// expose concrete nodes to parser scope\n// see http://zaach.github.io/jison/docs/#sharing-scope\nparser.yy = {\n Add: Add,\n Mul: Mul,\n Pow: Pow,\n Log: Log,\n Trig: Trig,\n Eq: Eq,\n Abs: Abs,\n Func: Func,\n Const: Const,\n Var: Var,\n Int: Int,\n Float: Float,\n parseError: parseError,\n\n constants: [\"e\"],\n symbolLexer: function(symbol) {\n if (_.contains(parser.yy.constants, symbol)) {\n return \"CONST\";\n } else if (_.contains(parser.yy.functions, symbol)) {\n return \"FUNC\";\n } else {\n return \"VAR\";\n }\n }\n};\n\nexport const parse = function(input, options) {\n try {\n if (options && options.functions) {\n // reserve the symbol \"i\" for complex numbers\n parser.yy.functions = _.without(options.functions, \"i\");\n } else {\n parser.yy.functions = [];\n }\n\n // If ',' is the decimal dividor in your country, replace any ','s\n // with '.'s.\n // This isn't perfect, since the output will all still have '.'s.\n // TODO(jack): Fix the output to have ','s in this case\n if (options && options.decimal_separator) {\n input = input.split(options.decimal_separator).join(\".\");\n }\n\n var expr = parser.parse(input).completeParse();\n return { parsed: true, expr: expr };\n } catch (e) {\n return { parsed: false, error: e.message };\n }\n};\n\n/* unit */\nexport function Unit(symbol) {\n this.symbol = symbol;\n}\nUnit.prototype = new Symbol();\n\n// If possible, replace unit prefixes with a multiplication.\n//\n// \"g\" -> Unit(\"g\")\n// \"kg\" -> 1000 * Unit(\"g\")\nvar unprefixify = function(symbol) {\n if (_(baseUnits).has(symbol) || _(derivedUnits).has(symbol)) {\n return new Unit(symbol);\n }\n\n // check for prefix\n var prefix = _(_(siPrefixes).keys()).find(function(testPrefix) {\n return new RegExp(\"^\" + testPrefix).test(symbol);\n });\n\n if (prefix) {\n var base = symbol.replace(new RegExp(\"^\" + prefix), \"\");\n\n // It's okay to be here if either:\n // * `base` is a base unit (the seven units listed in baseUnits)\n // * `base` is a derived unit which allows prefixes\n //\n // Otherwise, we're trying to parse a unit label which is not\n // allowed (mwk, mBTU, etc).\n if (_(baseUnits).has(base) ||\n (derivedUnits[base] &&\n derivedUnits[base].prefixes === hasPrefixes)) {\n\n return new Mul(siPrefixes[prefix], new Unit(base));\n } else {\n throw new Error(base + \" does not allow prefixes\");\n }\n } else {\n return new Unit(symbol);\n }\n};\n\nexport const unitParse = function(input) {\n try {\n var parseResult = unitParser.parse(input);\n\n // parseResult looks like:\n // {\n // magnitude: \"5\",\n // unit: {\n // num: [\n // { name: \"s\", pow: 2 }\n // ],\n // denom: [\n // { name: \"kg\", pow: 1 }\n // ]\n // }\n // }\n //\n // denom is optionally null\n\n var unitArray = [];\n\n _(parseResult.unit.num).each(function(unitSpec) {\n unitArray.push(\n new Pow(unprefixify(unitSpec.name), new Int(unitSpec.pow))\n );\n });\n\n _(parseResult.unit.denom).each(function(unitSpec) {\n unitArray.push(\n new Pow(unprefixify(unitSpec.name), new Int(-1 * unitSpec.pow))\n );\n });\n\n var unit = new Mul(unitArray).flatten();\n\n if (parseResult.type === \"unitMagnitude\") {\n // in the first case we have a magnitude coefficient as well as the\n // unit itself.\n var coefArray =\n [new Float(+parseResult.magnitude)].concat(unitArray);\n var expr = new Mul(coefArray);\n return {\n parsed: true,\n unit: unit,\n expr: expr,\n coefficient: parseResult.magnitude,\n type: parseResult.type\n };\n } else {\n\n // in the second case it's just the unit with no magnitude.\n return {\n parsed: true,\n unit: unit,\n type: parseResult.type,\n };\n }\n } catch (e) {\n return { parsed: false, error: e.message };\n }\n};\n\n_.extend(Unit.prototype, {\n func: Unit,\n args: function() { return [this.symbol]; },\n recurse: function() { return this; },\n\n eval: function(vars, options) {\n // This is called when comparing units. A unit doesn't affect the\n // numerical value of its coefficient, so this needs to be 1.\n //\n // On the other hand, things must not evaluate to the same thing if\n // they don't have the same type. I believe that's also true - form is\n // checked before numerical equivalence. I do not know where, though.\n // However, there are a couple tests checking this.\n return 1;\n },\n\n getUnits: function() { return [{ unit: this.symbol, pow: 1 }]; },\n\n codegen: function() { return \"1\"; },\n\n print: function() { return this.symbol; },\n\n tex: function() { return this.symbol; },\n\n // Simplify units by replacing prefixes with multiplication\n collect: function(options) {\n if (_(baseUnits).has(this.symbol)) {\n return this;\n } else if (_(derivedUnits).has(this.symbol)) {\n return derivedUnits[this.symbol].conversion;\n } else {\n throw new Error(\"could not understand unit: \" + this.symbol);\n }\n },\n});\n\nvar baseUnits = {\n m: new Unit(\"m\"),\n // Note: kg is the SI base unit but we use g for consistency\n g: new Unit(\"g\"),\n s: new Unit(\"s\"),\n A: new Unit(\"A\"),\n K: new Unit(\"K\"),\n mol: new Unit(\"mol\"),\n cd: new Unit(\"cd\"),\n};\n\nvar siPrefixes = {\n a: new Pow(new Int(10), new Int(-18)),\n f: new Pow(new Int(10), new Int(-15)),\n p: new Pow(new Int(10), new Int(-12)),\n n: new Pow(new Int(10), new Int(-9)),\n u: new Pow(new Int(10), new Int(-6)),\n m: new Pow(new Int(10), new Int(-3)),\n c: new Pow(new Int(10), new Int(-2)),\n d: new Pow(new Int(10), new Int(-1)),\n da: new Int(10),\n h: new Pow(new Int(10), new Int(2)),\n k: new Pow(new Int(10), new Int(3)),\n M: new Pow(new Int(10), new Int(6)),\n G: new Pow(new Int(10), new Int(9)),\n T: new Pow(new Int(10), new Int(12)),\n P: new Pow(new Int(10), new Int(15)),\n E: new Pow(new Int(10), new Int(18)),\n // http://en.wikipedia.org/wiki/Metric_prefix#.22Hella.22_prefix_proposal\n hella: new Pow(new Int(10), new Int(27)),\n};\n\n// Use these two values to mark a unit as either SI-prefixable or not.\nvar hasPrefixes = {};\nvar hasntPrefixes = {};\n\nvar makeAlias = function(str, prefixes) {\n var splits = str.split(\"|\");\n var coefficientStr = splits[0].trim();\n var unitsStr = splits[1].trim();\n\n var coefficient = Num.One;\n if (coefficientStr !== \"\") {\n coefficient = parse(coefficientStr).expr;\n }\n\n var numdenomStr = unitsStr.split(\"/\");\n var numdenom = [coefficient];\n\n if (numdenomStr[0]) {\n numdenomStr[0]\n .split(\" \")\n .filter(function(x) {\n return x !== \"\";\n }).map(function(x) {\n numdenom.push(new Unit(x));\n });\n }\n\n if (numdenomStr[1]) {\n numdenomStr[1]\n .split(\" \")\n .filter(function(x) {\n return x !== \"\";\n }).map(function(x) {\n numdenom.push(new Pow(new Unit(x), Num.Div));\n });\n }\n\n return {\n conversion: new Mul(numdenom),\n prefixes: prefixes,\n };\n};\n\n// This is a mapping of derived units (or different names for a unit) to their\n// definitions. For example, an inch is defined as 0.0254 m.\n//\n// Definitions don't need to be in terms of base units. For example, tsp is\n// defined in terms of tbsp (which is defined in terms of cup -> gal -> L ->\n// m^3). However, units must get simpler. I.e. there's no loop checking.\n//\n// makeAlias takes two parameters:\n// * a string specifying the simplification to perform\n// - a required pipe separates the constant factor from the base units\n// - the constant factor is parsed by KAS\n// - the base units are in a simple format which disallows exponents and\n// requires multiplicands to be space-separated (\"m m\" rather than \"m^2)\n// with an optional \"/\" separating numerator and denominator\n// - prefixes are not allowed to be used in the converted to units\n// (note that this restriction, the format of the string, and the choice to\n// use a string in the first place are made out of laziness to minimize\n// both typing and parsing)\n// * a boolean specifying whether or not it's acceptable to use SI units\n//\n// Where possible, these units are taken from \"The International System of\n// Units (SI)\" 8th edition (2006).\nvar derivedUnits = {\n // mass\n // The atomic mass unit / dalton.\n Da: makeAlias(\"1.6605388628 x 10^-24 | g\", hasPrefixes),\n u: makeAlias(\"| Da\", hasntPrefixes),\n\n // length\n \"meter\": makeAlias(\"| m\", hasntPrefixes),\n \"meters\": makeAlias(\"| m\", hasntPrefixes),\n \"in\": makeAlias(\"254 / 10000 | m\", hasntPrefixes),\n \"ft\": makeAlias(\"3048 / 10000 | m\", hasntPrefixes),\n \"yd\": makeAlias(\"9144 / 10000 | m\", hasntPrefixes),\n \"mi\": makeAlias(\"1609344 / 1000 | m\", hasntPrefixes),\n \"ly\": makeAlias(\"9.4607 x 10^15 | m\", hasntPrefixes),\n \"nmi\": makeAlias(\"1852 | m\", hasntPrefixes),\n \"Å\": makeAlias(\"10^-10 | m\", hasntPrefixes),\n \"pc\": makeAlias(\"3.0857 x 10^16 | m\", hasntPrefixes),\n\n // time\n \"min\": makeAlias(\"60 | s\", hasntPrefixes),\n \"hr\": makeAlias(\"3600 | s\", hasntPrefixes),\n \"sec\": makeAlias(\"| s\", hasntPrefixes),\n // TODO(joel) make day work\n \"day\": makeAlias(\"86400 | s\", hasntPrefixes),\n \"wk\": makeAlias(\"604800 | s\", hasntPrefixes),\n \"fortnight\": makeAlias(\"14 | day\", hasntPrefixes),\n \"shake\": makeAlias(\"10^-8 | s\", hasntPrefixes),\n \"olympiad\": makeAlias(\"126200000 | s\", hasntPrefixes),\n\n // temperature\n \"°C\": makeAlias(\"1 | K\", hasntPrefixes),\n \"°F\": makeAlias(\"5/9 | K\", hasntPrefixes),\n \"°R\": makeAlias(\"5/9 | K\", hasntPrefixes),\n\n // electric charge\n \"e\": makeAlias(\"1.6021765314 x 10^-19 | C\", hasntPrefixes),\n\n // speed\n \"c\": makeAlias(\"299792458 | m / s\", hasntPrefixes),\n \"kn\": makeAlias(\"514/1000 | m / s\", hasntPrefixes),\n \"kt\": makeAlias(\"| kn\", hasntPrefixes),\n \"knot\": makeAlias(\"| kn\", hasntPrefixes),\n\n // energy\n \"J\": makeAlias(\"| N m\", hasPrefixes),\n \"BTU\": makeAlias(\"1060 | J\", hasntPrefixes),\n \"cal\": makeAlias(\"4184 / 1000 | J\", hasPrefixes),\n \"eV\": makeAlias(\"1.602176514 x 10^-19 | J\", hasPrefixes),\n \"erg\": makeAlias(\"10^−7 | J\", hasPrefixes),\n\n // power\n \"W\": makeAlias(\"| J / s\", hasPrefixes),\n \"H-e\": makeAlias(\"80 | W\", hasntPrefixes),\n\n // force\n \"N\": makeAlias(\"1000 | g m / s s\", hasPrefixes),\n // \"lb\": makeAlias(\"4448 / 1000 | N\", hasntPrefixes),\n // 4.4482216152605\n \"lb\": makeAlias(\"4448221615 / 1000000000 | N\", hasntPrefixes),\n \"dyn\": makeAlias(\"10^-5 | N\", hasntPrefixes),\n\n // pressure\n \"Pa\": makeAlias(\"1 | N / m m m\", hasPrefixes),\n \"bar\": makeAlias(\"10^5 | Pa\", hasPrefixes),\n \"㏔\": makeAlias(\"1/1000 | bar\", hasntPrefixes),\n \"㍴\": makeAlias(\"| bar\", hasntPrefixes),\n \"atm\": makeAlias(\"101325 | Pa\", hasntPrefixes),\n \"Torr\": makeAlias(\"1/760 | atm\", hasntPrefixes),\n \"mmHg\": makeAlias(\"| Torr\", hasntPrefixes),\n\n // area\n \"ha\": makeAlias(\"10^4 | m m\", hasntPrefixes),\n \"b\": makeAlias(\"10^−28 | m m\", hasPrefixes),\n \"barn\": makeAlias(\"| b\", hasPrefixes),\n \"acre\": makeAlias(\"4046.87 | m m\", hasntPrefixes),\n \"skilodge\": makeAlias(\"10^-31 | m m\", hasntPrefixes),\n \"outhouse\": makeAlias(\"10^-34 | m m\", hasntPrefixes),\n \"shed\": makeAlias(\"10^-52 | m m\", hasntPrefixes),\n\n // volume\n \"L\": makeAlias(\"1/1000 | m m m\", hasPrefixes),\n \"gal\": makeAlias(\"3785/1000 | L\", hasPrefixes),\n \"cup\": makeAlias(\"1/16 | gal\", hasntPrefixes),\n \"qt\": makeAlias(\"1/4 | gal\", hasntPrefixes),\n \"quart\": makeAlias(\"| qt\", hasntPrefixes),\n \"p\": makeAlias(\"1/8 | gal\", hasntPrefixes),\n \"pt\": makeAlias(\"| p\", hasntPrefixes),\n \"pint\": makeAlias(\"| p\", hasntPrefixes),\n \"fl oz\": makeAlias(\"1/8 | cup\", hasntPrefixes),\n \"fl. oz.\": makeAlias(\"1/8 | cup\", hasntPrefixes),\n \"tbsp\": makeAlias(\"1/16 | cup\", hasntPrefixes),\n \"tsp\": makeAlias(\"1/3 | tbsp\", hasntPrefixes),\n\n // rotational\n // \"rad\":\n \"rev\": makeAlias(\"2 pi | rad\", hasntPrefixes),\n \"deg\": makeAlias(\"180 pi | rad\", hasntPrefixes),\n \"°\": makeAlias(\"| deg\", hasntPrefixes),\n \"arcminute\": makeAlias(\"1/60 | deg\", hasntPrefixes),\n \"arcsec\": makeAlias(\"1/3600 | deg\", hasntPrefixes),\n\n // dimensionless\n // \"B\": makeAlias(\"10 | dB\", hasntPrefixes), // XXX danger - logarithmic\n // \"dB\"\n // \"nP\"\n \"Hu\": makeAlias(\"1000 | dB\", hasPrefixes),\n \"dozen\": makeAlias(\"12 |\", hasntPrefixes),\n // XXX\n \"mol\": makeAlias(\"6.0221412927 x 10^23 |\", hasPrefixes),\n \"%\": makeAlias(\"1/100 |\", hasntPrefixes),\n \"percent\": makeAlias(\"| %\", hasntPrefixes),\n \"ppm\": makeAlias(\"1/1000000 |\", hasntPrefixes),\n\n // electric / magnetic\n \"V\": makeAlias(\"1000 | g m m / s s C\", hasPrefixes),\n \"C\": makeAlias(\"| A s\", hasPrefixes),\n \"ampere\": makeAlias(\"| A\", hasntPrefixes),\n \"Ω\": makeAlias(\"| V / A\", hasPrefixes),\n \"ohm\": makeAlias(\"| Ω\", hasntPrefixes),\n \"F\": makeAlias(\"| C / V\", hasPrefixes),\n \"H\": makeAlias(\"| ohm s\", hasPrefixes),\n \"T\": makeAlias(\"1000 | g / C s\", hasPrefixes),\n \"Wb\": makeAlias(\"1000 | g m m / C s\", hasPrefixes),\n\n // photometry\n // TODO not sure this is right\n \"lm\": makeAlias(\"pi x 10^4 | cd / m m\", hasntPrefixes),\n \"lx\": makeAlias(\"| lm / m m\", hasntPrefixes),\n \"nit\": makeAlias(\"| cd / m m\", hasntPrefixes),\n \"sb\": makeAlias(\"10^4 | cd / m m\", hasntPrefixes),\n \"stilb\": makeAlias(\"1 | sb\", hasntPrefixes),\n \"apostilb\": makeAlias(\"1 / pi x 10^(-4) | sb\", hasntPrefixes),\n \"blondel\": makeAlias(\"| apostilb\", hasntPrefixes),\n \"asb\": makeAlias(\"| apostilb\", hasntPrefixes),\n \"la\": makeAlias(\"| lm\", hasntPrefixes),\n \"Lb\": makeAlias(\"| lm\", hasntPrefixes),\n \"sk\": makeAlias(\"10^-7 | lm\", hasntPrefixes),\n \"skot\": makeAlias(\"| sk\", hasntPrefixes),\n \"bril\": makeAlias(\"10^-11 | lm\", hasntPrefixes),\n\n // other\n \"Hz\": makeAlias(\"| / s\", hasPrefixes),\n};\n\nexport const Zero = Num.Zero;\nexport const One = Num.One;\n","import _ from \"underscore\";\n\n// Assumes that both expressions have already been parsed\n// TODO(alex): be able to pass a random() function to compare()\nexport const compare = function(expr1, expr2, options) {\n var defaults = {\n form: false, // Check that the two expressions have the same form\n simplify: false, // Check that the second expression is simplified\n };\n\n /* Options that could be added in the future:\n * - Allow ratios: e.g. 3/1 and 3 should both be accepted for something\n * like slope\n * - Allow student to choose their own variable names\n */\n\n if (options !== undefined) {\n // eslint-disable-next-line no-undef\n options = _.extend(defaults, options);\n } else {\n options = defaults;\n }\n\n // TODO(CP-1614): Figure out how to make these messages translatable\n\n // Variable check\n var vars = expr1.sameVars(expr2);\n if (!vars.equal) {\n var message;\n if (vars.equalIgnoringCase) {\n message =\n \"Check your variables; one or more are using \" +\n \"the wrong case (upper or lower).\";\n } else {\n message =\n \"Check your variables; you may have used the wrong \" +\n \"letter for one or more of them.\";\n }\n return {\n equal: false,\n wrongVariableCase: vars.equalIgnoringCase,\n wrongVariableNames: !vars.equalIgnoringCase,\n message: message,\n };\n }\n\n // Semantic check\n if (!expr1.compare(expr2)) {\n return {equal: false, message: null};\n }\n\n // Syntactic check\n if (options.form && !expr1.sameForm(expr2)) {\n return {\n equal: false,\n message: \"Your answer is not in the correct form.\",\n };\n }\n\n // Syntactic check\n if (options.simplify && !expr1.isSimplified()) {\n return {\n equal: false,\n message: \"Your answer is not fully expanded and simplified.\",\n };\n }\n\n return {equal: true, message: null};\n};\n"],"names":["parser","o","k","v","l","length","$V0","$V1","$V2","$V3","$V4","trace","yy","symbols_","error","unitvalue","magnitude","unit","EOF","float","POW","int","multatoms","DIV","expatom","MUL","atom","nat","ATOM","FLOAT","NAT","NEG","$accept","$end","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","type","this","$","num","denom","concat","name","pow","table","defaultActions","parseError","str","hash","recoverable","Error","parse","input","self","stack","vstack","lstack","TERROR","args","slice","call","arguments","lexer","Object","create","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","push","ranges","options","lex","token","getPrototypeOf","symbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","text","match","line","loc","Array","first_line","last_line","first_column","last_column","range","apply","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","substr","oldLines","more","reject","backtrack_lexer","less","n","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","pop","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","INITIAL","inclusive","Parser","unitParser","$V5","$V6","$V7","$V8","$V9","$Va","$Vb","$Vc","$Vd","$Ve","$Vf","$Vg","$Vh","$Vi","$Vj","$Vk","$Vl","$Vm","$Vn","$Vo","equation","expression","SIGN","additive","multiplicative","triglog","negative","trig","TRIG","trigfunc","TRIGINV","logbase","ln","log","_","subscriptable","power","primitive","variable","VAR","CONST","INT","function","FUNC","invocation","sqrt","FRAC","Eq","Add","createOrAppend","Mul","handleNegative","fold","handleDivide","Log","natural","common","Trig","Pow","Var","Const","toLowerCase","Int","Number","Float","completeParse","addHint","nthroot","Abs","Func","symbolLexer","console","abstract","print","message","isNaN","object","Expr","Seq","terms","toArray","base","exp","arg","left","right","Symbol","subscript","Num","Rational","numerator","denominator","d","number","extend","func","construct","instance","recurse","method","passed","map","isString","eval","codegen","compile","code","Function","e","tex","asTex","defaults","display","dynamic","times","toString","repr","strip","normalize","expand","factor","collect","equals","other","simplify","once","step1","step2","step3","step4","simplified","isSimplified","exprArgs","filter","getVars","excludeFunc","uniq","flatten","invoke","sort","getConsts","getUnits","is","has","any","raiseToThe","isSubtract","isDivide","isRoot","needsExplicitMul","sameVars","vars1","vars2","same","array1","array2","difference","lower","array","equal","equalIgnoringCase","compare","varList","union","equalNumbers","num1","num2","delta","getDelta","Unit","expr1","expr2","unitList1","unitList2","isEqual","vars","floor","useFloats","each","min","extent","random","result1","partialEval","result2","toFixed","sameForm","findGCD","One","getDenominator","asMul","isPositive","isNegative","asPositiveFactor","hint","expr","hints","clone","parens","asExpr","negate","Neg","sortBy","term","partition","groupBy","numbers","others","identity","grouped","flattened","pluck","undefined","reduce","all","oldTerm","newTerm","indexOf","newTerms","isArray","remove","memo","pairs","muls","pair","collected","compact","zip","keepNegative","factors","rest","remainder","add","tmUnits","chain","value","a","b","localeCompare","cdot","inverses","inverse","negatives","withThisRemoved","splice","hasDenom","shouldPushDown","fraction","Div","subtract","entered","isAdd","isInverse","mul","hasAdd","hasInverseAdd","normals","adds","expanded","temp","factored","rational","partitioned","Zero","summed","trigs","isBasic","logs","exprs","byArg","funcs","sin","cos","tan","cot","byBase","factorIn","negativeOne","factorOut","list","divide","isNum","find","negated","first","isInt","reversed","reverse","divided","last","initial","trigLog","open","newTrigLog","pos","neg","some","every","firstNeg","firstNum","evaledBase","evaledExp","simplifiedExp","decimals","bind","asDivide","isSimple","positive","signed","cache","indices","without","pick","isSimilarLog","preciseFloats","asRational","decimalsInBase","getDecimalPlaces","decimalsInRoot","newBase","isDiv","root","isSquaredTrig","expA","expB","Sqrt","radicand","degree","isNatural","Ten","functions","csc","sec","arcsin","asin","arccos","acos","arctan","atan","arccsc","arcsec","arccot","sinh","argStr","cosh","tanh","csch","sech","coth","isEven","contains","positives","signs","eq","unfactored","isZero","isInequality","isEquality","divideThrough","dividedResult","eq1","eq2","solveLinearEquationForVariable","newVars","x","parsedFunc","parsed","sub","prettyPrint","PI","E","pi","max","gcd","toDecimalPlaces","parts","places","Sub","mod","constants","decimal_separator","unprefixify","baseUnits","derivedUnits","prefix","siPrefixes","keys","testPrefix","RegExp","test","prefixes","hasPrefixes","unitParse","parseResult","unitArray","unitSpec","coefficient","conversion","m","g","s","A","K","mol","cd","f","u","da","h","M","G","T","P","hella","hasntPrefixes","makeAlias","splits","coefficientStr","trim","unitsStr","numdenomStr","numdenom","Da","meter","meters","in","ft","yd","mi","ly","nmi","pc","hr","day","wk","fortnight","shake","olympiad","kn","kt","knot","J","BTU","cal","eV","erg","W","N","lb","dyn","Pa","bar","atm","Torr","mmHg","ha","barn","acre","skilodge","outhouse","shed","L","gal","cup","qt","quart","pt","pint","tbsp","tsp","rev","deg","arcminute","Hu","dozen","percent","ppm","V","C","ampere","ohm","F","H","Wb","lm","lx","nit","sb","stilb","apostilb","blondel","asb","la","Lb","sk","skot","bril","Hz","form","wrongVariableCase","wrongVariableNames"],"mappings":"0BA2EA,IAAIA,EAAU,WACVC,IAAAA,EAAE,SAASC,EAAEC,EAAEF,EAAEG,GAAOH,IAAAA,EAAEA,GAAG,GAAGG,EAAEF,EAAEG,OAAOD,IAAIH,EAAEC,EAAEE,IAAID,GAAG,OAAOF,GAAGK,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,GAAGC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,GAAG,GAAG,IAC5HV,EAAS,CAACW,MAAO,aACrBC,GAAI,GACJC,SAAU,CAACC,MAAQ,EAAEC,UAAY,EAAEC,UAAY,EAAEC,KAAO,EAAEC,IAAM,EAAEC,MAAQ,EAAEC,IAAM,EAAEC,IAAM,EAAEC,UAAY,GAAGC,IAAM,GAAGC,QAAU,GAAGC,IAAM,GAAGC,KAAO,GAAG,IAAI,GAAGC,IAAM,GAAGC,KAAO,GAAGC,MAAQ,GAAGC,IAAM,GAAGC,IAAM,GAAGC,QAAU,EAASC,KAAA,GAC9NC,WAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAS,GAAA,OACjGC,aAAc,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAC3HC,cAAe,SAAmBC,EAAQC,EAAQC,EAAU3B,EAAI4B,EAAyBC,EAAiBC,GAG1G,IAAIC,EAAKF,EAAGpC,OAAS,EACrB,OAAQmC,GACR,KAAK,EAEc,MAAA,CACHI,KAAM,gBACN5B,UAAWyB,EAAGE,EAAG,GACjB1B,KAAMwB,EAAGE,EAAG,IAI5B,KAAK,EAEc,MAAA,CACHC,KAAM,iBACN3B,KAAMwB,EAAGE,EAAG,IAI5B,KAAK,EAEOE,KAAKC,EAAIL,EAAGE,EAAG,GAAK,IAAMF,EAAGE,GAEzC,MACA,KAAK,EAAG,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GACvCE,KAAKC,EAAIL,EAAGE,GACb,MACA,KAAK,EAEOE,KAAKC,EAAI,CACLC,IAAKN,EAAGE,EAAG,GACXK,MAAOP,EAAGE,IAG1B,MACA,KAAK,EAEOE,KAAKC,EAAI,CACLC,IAAKN,EAAGE,GACRK,MAAO,MAGvB,MACA,KAAK,EACJH,KAAKC,EAAI,CAACL,EAAGE,EAAG,IAAIM,OAAOR,EAAGE,IAC/B,MACA,KAAK,EACJE,KAAKC,EAAI,CAACL,EAAGE,EAAG,IAAIM,OAAOR,EAAGE,IAC/B,MACA,KAAK,EACJE,KAAKC,EAAI,CAACL,EAAGE,IACd,MACA,KAAK,GAEOE,KAAKC,EAAI,CACLI,KAAMT,EAAGE,EAAG,GACZQ,IAAKV,EAAGE,IAGxB,MACA,KAAK,GAEOE,KAAKC,EAAI,CACLI,KAAMT,EAAGE,GACTQ,IAAK,GAGrB,MACA,KAAK,GACCL,KAAAA,EAAIT,EACV,MACA,KAAK,GACJQ,KAAKC,EAAI,IAAML,EAAGE,KAInBS,MAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG9C,EAAI,GAAG,CAAC,EAAE,GAAMC,GAAAA,GAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAMD,GAAAA,GAAK,CAAG,EAAA,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,IAAO,GAAA,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,GAAM,GAAA,CAAC,EAAE,KAAKL,EAAEO,EAAI,CAAC,EAAE,KAAKP,EAAEO,EAAI,CAAC,EAAE,KAAKP,EAAEQ,EAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAOH,GAAAA,IAAML,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,KAAKA,EAAES,EAAI,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,MAAMT,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,KAAK,CAAG,EAAA,CAAC,EAAE,KAAK,CAAG,EAAA,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAO,GAAA,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAMK,GAAAA,GAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAMA,GAAAA,GAAKL,EAAEQ,EAAI,CAAC,EAAE,IAAI,CAAC,GAAG,GAAMF,GAAAA,GAAK,CAAG,EAAA,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,KAAK,CAAI,GAAA,CAAC,EAAE,KAAK,CAAG,EAAA,CAAC,EAAE,IAAIN,EAAEQ,EAAI,CAAC,EAAE,IAAIR,EAAES,EAAI,CAAC,EAAE,KAAK,CAAI,GAAA,CAAC,EAAE,MAClhB2C,eAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,GAAM,GAAA,CAAC,EAAE,KACrEC,WAAY,SAAqBC,EAAKC,GAC9BA,IAAAA,EAAKC,YAGL,MAAM,IAAIC,MAAMH,GAFX5C,KAAAA,MAAM4C,IAKnBI,MAAO,SAAeC,GACdC,IAAAA,EAAOhB,KAAMiB,EAAQ,CAAC,GAAiBC,EAAS,CAAC,MAAOC,EAAS,GAAIZ,EAAQP,KAAKO,MAAOf,EAAS,GAAIE,EAAW,EAAGD,EAAS,EAAmB2B,EAAS,EAAG/C,EAAM,EAClKgD,EAAOF,EAAOG,MAAMC,KAAKC,UAAW,GACpCC,EAAQC,OAAOC,OAAO3B,KAAKyB,OAC3BG,EAAc,CAAE7D,GAAI,IACxB,IAAK,IAAIV,KAAK2C,KAAKjC,GACX2D,OAAOG,UAAUC,eAAeP,KAAKvB,KAAKjC,GAAIV,KAC9CuE,EAAY7D,GAAGV,GAAK2C,KAAKjC,GAAGV,IAGpCoE,EAAMM,SAAShB,EAAOa,EAAY7D,IAClC6D,EAAY7D,GAAG0D,MAAQA,EACvBG,EAAY7D,GAAGZ,OAAS6C,UACG,IAAhByB,EAAMO,SACbP,EAAMO,OAAS,IAEnB,IAAIC,EAAQR,EAAMO,OAClBb,EAAOe,KAAKD,GACRE,IAAAA,EAASV,EAAMW,SAAWX,EAAMW,QAAQD,OAYxC,SAASE,IACL,IAAIC,EAKJ,MAHqB,iBADrBA,EAAQb,EAAMY,OAAShE,KAEnBiE,EAAQtB,EAAKhD,SAASsE,IAAUA,GAE7BA,EAjB0B,mBAA9BV,EAAY7D,GAAG0C,WACtBT,KAAKS,WAAamB,EAAY7D,GAAG0C,WAE5BA,KAAAA,WAAaiB,OAAOa,eAAevC,MAAMS,WAiBlD,IADA,IAAI+B,EAAwBC,EAAOC,EAAWC,EAAeC,EAAGC,EAAKC,EAAUC,EAA9BC,EAAQ,KAC5C,CAUG,GATZP,EAAQxB,EAAMA,EAAMzD,OAAS,GACzBwC,KAAKQ,eAAeiC,GACpBC,EAAS1C,KAAKQ,eAAeiC,IAEzBD,MAAAA,IACAA,EAASH,KAEbK,EAASnC,EAAMkC,IAAUlC,EAAMkC,GAAOD,SAER,IAAXE,IAA2BA,EAAOlF,SAAWkF,EAAO,GAAI,CACnEO,IAAAA,EAAS,GAEb,IAAKL,KADLG,EAAW,GACDxC,EAAMkC,GACRzC,KAAKX,WAAWuD,IAAMA,EAAIxB,GAC1B2B,EAASb,KAAK,IAAOlC,KAAKX,WAAWuD,GAAK,KAI9CK,EADAxB,EAAMyB,aACG,wBAA0BxD,EAAW,GAAK,MAAQ+B,EAAMyB,eAAiB,eAAiBH,EAASI,KAAK,MAAQ,WAAcnD,KAAKX,WAAWmD,IAAWA,GAAU,IAEnK,wBAA0B9C,EAAW,GAAK,iBAAmB8C,GAAUnE,EAAM,eAAiB,KAAQ2B,KAAKX,WAAWmD,IAAWA,GAAU,KAEnJ/B,KAAAA,WAAWwC,EAAQ,CACpBG,KAAM3B,EAAM4B,MACZf,MAAOtC,KAAKX,WAAWmD,IAAWA,EAClCc,KAAM7B,EAAM/B,SACZ6D,IAAKtB,EACLc,SAAUA,IAGtB,GAAIL,EAAO,aAAcc,OAASd,EAAOlF,OAAS,EACxC,MAAA,IAAIqD,MAAM,oDAAsD4B,EAAQ,YAAcD,GAExFE,OAAAA,EAAO,IACf,KAAK,EACDzB,EAAMiB,KAAKM,GACXtB,EAAOgB,KAAKT,EAAMjC,QAClB2B,EAAOe,KAAKT,EAAMO,QAClBf,EAAMiB,KAAKQ,EAAO,IAClBF,EAAS,KAEL/C,EAASgC,EAAMhC,OACfD,EAASiC,EAAMjC,OACfE,EAAW+B,EAAM/B,SACjBuC,EAAQR,EAAMO,OAQlB,MACJ,KAAK,EAwBD,GAvBAa,EAAM7C,KAAKV,aAAaoD,EAAO,IAAI,GACnCM,EAAM/C,EAAIiB,EAAOA,EAAO1D,OAASqF,GACjCG,EAAMnD,GAAK,CACP4D,WAAYtC,EAAOA,EAAO3D,QAAUqF,GAAO,IAAIY,WAC/CC,UAAWvC,EAAOA,EAAO3D,OAAS,GAAGkG,UACrCC,aAAcxC,EAAOA,EAAO3D,QAAUqF,GAAO,IAAIc,aACjDC,YAAazC,EAAOA,EAAO3D,OAAS,GAAGoG,aAEvCzB,IACAa,EAAMnD,GAAGgE,MAAQ,CACb1C,EAAOA,EAAO3D,QAAUqF,GAAO,IAAIgB,MAAM,GACzC1C,EAAOA,EAAO3D,OAAS,GAAGqG,MAAM,UAYvB,KATjBlB,EAAI3C,KAAKT,cAAcuE,MAAMd,EAAO,CAChCxD,EACAC,EACAC,EACAkC,EAAY7D,GACZ2E,EAAO,GACPxB,EACAC,GACFf,OAAOiB,KAEL,OAAOsB,EAEPE,IACA5B,EAAQA,EAAMK,MAAM,GAAI,EAAIuB,EAAM,GAClC3B,EAASA,EAAOI,MAAM,GAAI,EAAIuB,GAC9B1B,EAASA,EAAOG,MAAM,GAAI,EAAIuB,IAElC5B,EAAMiB,KAAKlC,KAAKV,aAAaoD,EAAO,IAAI,IACxCxB,EAAOgB,KAAKc,EAAM/C,GAClBkB,EAAOe,KAAKc,EAAMnD,IAClBiD,EAAWvC,EAAMU,EAAMA,EAAMzD,OAAS,IAAIyD,EAAMA,EAAMzD,OAAS,IAC/DyD,EAAMiB,KAAKY,GACX,MACJ,KAAK,EACD,OAAO,GAGf,OAAO,IAGPrB,EACS,CAEbpD,IAAI,EAEJoC,WAAW,SAAoBC,EAAKC,GAC5B,IAAIX,KAAKjC,GAAGZ,OAGR,MAAM,IAAI0D,MAAMH,GAFX3C,KAAAA,GAAGZ,OAAOsD,WAAWC,EAAKC,IAO3CoB,SAAS,SAAUhB,EAAOhD,GAiBlB,OAhBAiC,KAAKjC,GAAKA,GAAMiC,KAAKjC,IAAM,GACtBgG,KAAAA,OAAShD,EACTiD,KAAAA,MAAQhE,KAAKiE,WAAajE,KAAKkE,MAAO,EAC3ClE,KAAKN,SAAWM,KAAKP,OAAS,EACzBD,KAAAA,OAASQ,KAAKmE,QAAUnE,KAAKqD,MAAQ,GAC1CrD,KAAKoE,eAAiB,CAAC,WACvBpE,KAAKgC,OAAS,CACVyB,WAAY,EACZE,aAAc,EACdD,UAAW,EACXE,YAAa,GAEb5D,KAAKoC,QAAQD,SACRH,KAAAA,OAAO6B,MAAQ,CAAC,EAAE,IAEtBQ,KAAAA,OAAS,EACPrE,MAIfe,MAAM,WACE,IAAIuD,EAAKtE,KAAK+D,OAAO,GAkBrB,OAjBKvE,KAAAA,QAAU8E,EACftE,KAAKP,SACLO,KAAKqE,SACAhB,KAAAA,OAASiB,EACTH,KAAAA,SAAWG,EACJA,EAAGjB,MAAM,oBAEjBrD,KAAKN,WACAsC,KAAAA,OAAO0B,aAEP1B,KAAAA,OAAO4B,cAEZ5D,KAAKoC,QAAQD,QACbnC,KAAKgC,OAAO6B,MAAM,KAGjBE,KAAAA,OAAS/D,KAAK+D,OAAOzC,MAAM,GACzBgD,GAIfC,MAAM,SAAUD,GACR,IAAIzB,EAAMyB,EAAG9G,OACTgH,EAAQF,EAAGG,MAAM,iBAErBzE,KAAK+D,OAASO,EAAKtE,KAAK+D,OACxB/D,KAAKR,OAASQ,KAAKR,OAAOkF,OAAO,EAAG1E,KAAKR,OAAOhC,OAASqF,GAEpDwB,KAAAA,QAAUxB,EACX8B,IAAAA,EAAW3E,KAAKqD,MAAMoB,MAAM,iBAChCzE,KAAKqD,MAAQrD,KAAKqD,MAAMqB,OAAO,EAAG1E,KAAKqD,MAAM7F,OAAS,GACtDwC,KAAKmE,QAAUnE,KAAKmE,QAAQO,OAAO,EAAG1E,KAAKmE,QAAQ3G,OAAS,GAExDgH,EAAMhH,OAAS,IACfwC,KAAKN,UAAY8E,EAAMhH,OAAS,GAEpC,IAAImF,EAAI3C,KAAKgC,OAAO6B,MAgBpB,OAdA7D,KAAKgC,OAAS,CACVyB,WAAYzD,KAAKgC,OAAOyB,WACxBC,UAAW1D,KAAKN,SAAW,EAC3BiE,aAAc3D,KAAKgC,OAAO2B,aAC1BC,YAAaY,GACRA,EAAMhH,SAAWmH,EAASnH,OAASwC,KAAKgC,OAAO2B,aAAe,GAC5DgB,EAASA,EAASnH,OAASgH,EAAMhH,QAAQA,OAASgH,EAAM,GAAGhH,OAChEwC,KAAKgC,OAAO2B,aAAed,GAG7B7C,KAAKoC,QAAQD,SACbnC,KAAKgC,OAAO6B,MAAQ,CAAClB,EAAE,GAAIA,EAAE,GAAK3C,KAAKP,OAASoD,IAEpD7C,KAAKP,OAASO,KAAKR,OAAOhC,OACnBwC,MAIf4E,KAAK,WAEG,OADKZ,KAAAA,OAAQ,EACNhE,MAIf6E,OAAO,WACC,OAAI7E,KAAKoC,QAAQ0C,iBACRb,KAAAA,YAAa,EASfjE,MAPIA,KAAKS,WAAW,0BAA4BT,KAAKN,SAAW,GAAK,mIAAqIM,KAAKkD,eAAgB,CAC9NE,KAAM,GACNd,MAAO,KACPgB,KAAMtD,KAAKN,YAQ3BqF,KAAK,SAAUC,GACFT,KAAAA,MAAMvE,KAAKqD,MAAM/B,MAAM0D,KAIpCC,UAAU,WACF,IAAIC,EAAOlF,KAAKmE,QAAQO,OAAO,EAAG1E,KAAKmE,QAAQ3G,OAASwC,KAAKqD,MAAM7F,QAC5D,OAAC0H,EAAK1H,OAAS,GAAK,MAAM,IAAM0H,EAAKR,QAAQ,IAAIS,QAAQ,MAAO,KAI/EC,cAAc,WACFC,IAAAA,EAAOrF,KAAKqD,MAIT,OAHHgC,EAAK7H,OAAS,KACd6H,GAAQrF,KAAK+D,OAAOW,OAAO,EAAG,GAAGW,EAAK7H,UAElC6H,EAAKX,OAAO,EAAE,KAAOW,EAAK7H,OAAS,GAAK,MAAQ,KAAK2H,QAAQ,MAAO,KAIpFjC,aAAa,WACL,IAAIoC,EAAMtF,KAAKiF,YACXM,EAAI,IAAI/B,MAAM8B,EAAI9H,OAAS,GAAG2F,KAAK,KAChCmC,OAAAA,EAAMtF,KAAKoF,gBAAkB,KAAOG,EAAI,KAIvDC,WAAW,SAASnC,EAAOoC,GACnB,IAAInD,EACAkC,EACAkB,EAwDJ,GAtDI1F,KAAKoC,QAAQ0C,kBAEbY,EAAS,CACLhG,SAAUM,KAAKN,SACfsC,OAAQ,CACJyB,WAAYzD,KAAKgC,OAAOyB,WACxBC,UAAW1D,KAAK0D,UAChBC,aAAc3D,KAAKgC,OAAO2B,aAC1BC,YAAa5D,KAAKgC,OAAO4B,aAE7BpE,OAAQQ,KAAKR,OACb6D,MAAOrD,KAAKqD,MACZsC,QAAS3F,KAAK2F,QACdxB,QAASnE,KAAKmE,QACd1E,OAAQO,KAAKP,OACb4E,OAAQrE,KAAKqE,OACbL,MAAOhE,KAAKgE,MACZD,OAAQ/D,KAAK+D,OACbhG,GAAIiC,KAAKjC,GACTqG,eAAgBpE,KAAKoE,eAAe9C,MAAM,GAC1C4C,KAAMlE,KAAKkE,MAEXlE,KAAKoC,QAAQD,SACbuD,EAAO1D,OAAO6B,MAAQ7D,KAAKgC,OAAO6B,MAAMvC,MAAM,MAItDkD,EAAQnB,EAAM,GAAGA,MAAM,sBAEnBrD,KAAKN,UAAY8E,EAAMhH,QAE3BwC,KAAKgC,OAAS,CACVyB,WAAYzD,KAAKgC,OAAO0B,UACxBA,UAAW1D,KAAKN,SAAW,EAC3BiE,aAAc3D,KAAKgC,OAAO4B,YAC1BA,YAAaY,EACAA,EAAMA,EAAMhH,OAAS,GAAGA,OAASgH,EAAMA,EAAMhH,OAAS,GAAG6F,MAAM,UAAU,GAAG7F,OAC5EwC,KAAKgC,OAAO4B,YAAcP,EAAM,GAAG7F,QAEpDwC,KAAKR,QAAU6D,EAAM,GACrBrD,KAAKqD,OAASA,EAAM,GACfsC,KAAAA,QAAUtC,EACfrD,KAAKP,OAASO,KAAKR,OAAOhC,OACtBwC,KAAKoC,QAAQD,SACbnC,KAAKgC,OAAO6B,MAAQ,CAAC7D,KAAKqE,OAAQrE,KAAKqE,QAAUrE,KAAKP,SAErDuE,KAAAA,OAAQ,EACRC,KAAAA,YAAa,EAClBjE,KAAK+D,OAAS/D,KAAK+D,OAAOzC,MAAM+B,EAAM,GAAG7F,QACzCwC,KAAKmE,SAAWd,EAAM,GACtBf,EAAQtC,KAAKT,cAAcgC,KAAKvB,KAAMA,KAAKjC,GAAIiC,KAAMyF,EAAczF,KAAKoE,eAAepE,KAAKoE,eAAe5G,OAAS,IAChHwC,KAAKkE,MAAQlE,KAAK+D,SACbG,KAAAA,MAAO,GAEZ5B,EACA,OAAOA,EACJ,GAAItC,KAAKiE,WAAY,CAExB,IAAK,IAAI5G,KAAKqI,EACV1F,KAAK3C,GAAKqI,EAAOrI,GAEd,OAAA,EAEX,OAAO,GAIfgI,KAAK,WACO,GAAArF,KAAKkE,KACL,OAAOlE,KAAK3B,IAMhB,IAAIiE,EACAe,EACAuC,EACAC,EAPC7F,KAAK+D,SACDG,KAAAA,MAAO,GAOXlE,KAAKgE,QACDxE,KAAAA,OAAS,GACT6D,KAAAA,MAAQ,IAGjB,IADA,IAAIyC,EAAQ9F,KAAK+F,gBACRC,EAAI,EAAGA,EAAIF,EAAMtI,OAAQwI,IAE9B,IADAJ,EAAY5F,KAAK+D,OAAOV,MAAMrD,KAAK8F,MAAMA,EAAME,SAC5B3C,GAASuC,EAAU,GAAGpI,OAAS6F,EAAM,GAAG7F,QAAS,CAGhE,GAFA6F,EAAQuC,EACRC,EAAQG,EACJhG,KAAKoC,QAAQ0C,gBAAiB,CAE1BxC,IAAU,KADdA,EAAQtC,KAAKwF,WAAWI,EAAWE,EAAME,KAErC,OAAO1D,EACJ,GAAItC,KAAKiE,WAAY,CACxBZ,GAAQ,EACR,SAGA,OAAO,EAER,IAAKrD,KAAKoC,QAAQ6D,KACrB,MAIZ,OAAI5C,GAEc,KADdf,EAAQtC,KAAKwF,WAAWnC,EAAOyC,EAAMD,MAE1BvD,EAKK,KAAhBtC,KAAK+D,OACE/D,KAAK3B,IAEL2B,KAAKS,WAAW,0BAA4BT,KAAKN,SAAW,GAAK,yBAA2BM,KAAKkD,eAAgB,CACpHE,KAAM,GACNd,MAAO,KACPgB,KAAMtD,KAAKN,YAM3B2C,IAAI,WACI,IAAIM,EAAI3C,KAAKqF,OACb,OAAI1C,GAGO3C,KAAKqC,OAKxB6D,MAAM,SAAgBC,GACdnG,KAAKoE,eAAelC,KAAKiE,IAIjCC,SAAS,WAEGpB,OADIhF,KAAKoE,eAAe5G,OAAS,EAC7B,EACGwC,KAAKoE,eAAeiC,MAEpBrG,KAAKoE,eAAe,IAKvC2B,cAAc,WACN,OAAI/F,KAAKoE,eAAe5G,QAAUwC,KAAKoE,eAAepE,KAAKoE,eAAe5G,OAAS,GACxEwC,KAAKsG,WAAWtG,KAAKoE,eAAepE,KAAKoE,eAAe5G,OAAS,IAAIsI,MAErE9F,KAAKsG,WAAL,QAA2BR,OAK9CS,SAAS,SAAmBvB,GAEhBA,OADJA,EAAIhF,KAAKoE,eAAe5G,OAAS,EAAIgJ,KAAKC,IAAIzB,GAAK,KAC1C,EACEhF,KAAKoE,eAAeY,GAEpB,WAKnB0B,UAAU,SAAoBP,GACjBD,KAAAA,MAAMC,IAInBQ,eAAe,WACA,OAAA3G,KAAKoE,eAAe5G,QAEnC4E,QAAS,GACT7C,cAAe,SAAmBxB,EAAG6I,EAAIC,EAA0BC,GAEnE,OAAOD,GACP,KAAK,EAAE,OAAO,GAEd,KAAK,EAAE,MAAO,IAEd,KAAK,EAAE,MAAO,IAEd,KAAK,EAAE,OAAO,EAEd,KAAK,EAAE,OAAO,GAEd,KAAK,EAAE,OAAO,GAEd,KAAK,EAAE,OAAO,GAEd,KAAK,EAAE,OAAO,GAEd,KAAK,EAAE,OAAO,GAEd,KAAK,EAEL,KAAK,GAEL,KAAK,GAAG,OAAO,GAEf,KAAK,GACL,MACA,KAAK,GAAG,OAAO,IAIff,MAAO,CAAC,UAAU,UAAU,UAAU,oDAAoD,UAAU,UAAU,sBAAsB,cAAc,SAAS,wBAAwB,mBAAmB,kDAAkD,WAAW,UACnQQ,WAAY,CAAWS,QAAA,CAACjB,MAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,IAAgBkB,WAAA,KAK9E,SAASC,IACFlJ,KAAAA,GAAK,GAGL,OALPZ,EAAOsE,MAAQA,EAIfwF,EAAOpF,UAAY1E,EAAOA,EAAO8J,OAASA,EACnC,IAAIA,EAxlBG,GA2lBDC,EAAa/J,EC1lBtBA,EAAU,WACVC,IAAAA,EAAE,SAASC,EAAEC,EAAEF,EAAEG,GAAOH,IAAAA,EAAEA,GAAG,GAAGG,EAAEF,EAAEG,OAAOD,IAAIH,EAAEC,EAAEE,IAAID,GAAG,OAAOF,GAAGK,EAAI,CAAC,EAAE,GAAGC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIsJ,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,IAAIC,EAAI,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAIC,EAAI,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IACliBnL,EAAS,CAACW,MAAO,aACrBC,GAAI,GACJC,SAAU,CAACC,MAAQ,EAAEsK,SAAW,EAAEC,WAAa,EAAEC,KAAO,EAAEpK,IAAM,EAAEqK,SAAW,EAAE,IAAI,EAAEC,eAAiB,EAAE,IAAI,GAAGC,QAAU,GAAG,IAAI,GAAGC,SAAW,GAAG,IAAI,GAAGC,KAAO,GAAGC,KAAO,GAAGC,SAAW,GAAG,IAAI,GAAGC,QAAU,GAAGC,QAAU,GAAGC,GAAK,GAAGC,IAAM,GAAGC,EAAI,GAAGC,cAAgB,GAAGC,MAAQ,GAAGC,UAAY,GAAGC,SAAW,GAAGC,IAAM,GAAGC,MAAQ,GAAGC,IAAM,GAAG5K,MAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG6K,SAAW,GAAGC,KAAO,GAAGC,WAAa,GAAGC,KAAO,GAAG,IAAI,GAAG,IAAI,GAAGvD,IAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,GAAGwD,KAAO,GAAG9K,QAAU,EAASC,KAAA,GACtfC,WAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAY,GAAA,QACzQC,aAAc,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,IACvTC,cAAe,SAAmBC,EAAQC,EAAQC,EAAU3B,EAAI4B,EAAyBC,EAAiBC,GAG1G,IAAIC,EAAKF,EAAGpC,OAAS,EACrB,OAAQmC,GACR,KAAK,EACE,OAAA,IAAI5B,EAAGmM,GAAGtK,EAAGE,EAAG,GAAIF,EAAGE,EAAG,GAAIF,EAAGE,EAAG,IAE3C,KAAK,EACL,OAAOF,EAAGE,EAAG,GAEb,KAAK,EACL,OAAO,IAAI/B,EAAGoM,IAAI,IAElB,KAAK,EAAG,KAAK,EAAG,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GACpFnK,KAAKC,EAAIL,EAAGE,GACZ,MACA,KAAK,EACLE,KAAKC,EAAIlC,EAAGoM,IAAIC,eAAexK,EAAGE,EAAG,GAAIF,EAAGE,IAC5C,MACA,KAAK,EACLE,KAAKC,EAAIlC,EAAGoM,IAAIC,eAAexK,EAAGE,EAAG,GAAI/B,EAAGsM,IAAIC,eAAe1K,EAAGE,GAAK,aACvE,MACA,KAAK,EACAG,KAAAA,EAAIlC,EAAGsM,IAAIE,KAAKxM,EAAGsM,IAAID,eAAexK,EAAGE,EAAG,GAAIF,EAAGE,KACxD,MACA,KAAK,EACAG,KAAAA,EAAIlC,EAAGsM,IAAIE,KAAKxM,EAAGsM,IAAID,eAAexK,EAAGE,EAAG,GAAIF,EAAGE,KACxD,MACA,KAAK,GACAG,KAAAA,EAAIlC,EAAGsM,IAAIE,KAAKxM,EAAGsM,IAAIG,aAAa5K,EAAGE,EAAG,GAAIF,EAAGE,KACtD,MACA,KAAK,GACLE,KAAKC,EAAIlC,EAAGsM,IAAIC,eAAe1K,EAAGE,IAClC,MACA,KAAK,GAAI,KAAK,GACdE,KAAKC,EAAI,CAACT,GACV,MACA,KAAK,GACLQ,KAAKC,EAAIL,EAAGE,EAAG,GAAGM,OAAOR,EAAGE,IAC5B,MACA,KAAK,GACLE,KAAKC,EAAIlC,EAAG0M,IAAIC,UAChB,MACA,KAAK,GACL1K,KAAKC,EAAIlC,EAAG0M,IAAIE,SAChB,MACA,KAAK,GACL3K,KAAKC,EAAIlC,EAAG6M,KAAKjJ,OAAO/B,EAAGE,EAAG,GAAIF,EAAGE,IACrC,MACA,KAAK,GACLE,KAAKC,EAAIlC,EAAG0M,IAAI9I,OAAO/B,EAAGE,EAAG,GAAIF,EAAGE,IACpC,MACA,KAAK,GACLE,KAAKC,EAAI,IAAIlC,EAAG8M,IAAIjL,EAAGE,EAAG,GAAIF,EAAGE,IACjC,MACA,KAAK,GAAI,KAAK,GACTG,KAAAA,EAAIT,EACT,MACA,KAAK,GACLQ,KAAKC,EAAI,IAAIlC,EAAG+M,IAAIlL,EAAGE,EAAG,GAAIF,EAAGE,IACjC,MACA,KAAK,GACAG,KAAAA,EAAI,IAAIlC,EAAG+M,IAAIlL,EAAGE,IACvB,MACA,KAAK,GACAG,KAAAA,EAAI,IAAIlC,EAAGgN,MAAMvL,EAAOwL,eAC7B,MACA,KAAK,GACLhL,KAAKC,EAAIlC,EAAGkN,IAAItJ,OAAOuJ,OAAO1L,IAC9B,MACA,KAAK,GACLQ,KAAKC,EAAIlC,EAAGoN,MAAMxJ,OAAOuJ,OAAO1L,IAChC,MACA,KAAK,GACAS,KAAAA,EAAIL,EAAGE,EAAG,GAAGsL,gBAClB,MACA,KAAK,GACLpL,KAAKC,EAAIL,EAAGE,EAAG,GAAGsL,gBAAgBC,QAAQ,UAC1C,MACA,KAAK,GAAI,KAAK,GACdrL,KAAKC,EAAIlC,EAAG8M,IAAIb,KAAKpK,EAAGE,EAAG,IAC3B,MACA,KAAK,GACAG,KAAAA,EAAI,IAAIlC,EAAG8M,IAAIS,QAAQ1L,EAAGE,EAAG,GAAIF,EAAGE,EAAG,IAC5C,MACA,KAAK,GAAI,KAAK,GAAI,KAAK,GACvBE,KAAKC,EAAI,IAAIlC,EAAGwN,IAAI3L,EAAGE,EAAG,IAC1B,MACA,KAAK,GACAG,KAAAA,EAAI,IAAIlC,EAAGyN,KAAK5L,EAAGE,EAAG,GAAIF,EAAGE,EAAG,IACrC,MACA,KAAK,GACAG,KAAAA,EAAIlC,EAAGsM,IAAIG,aAAa5K,EAAGE,EAAG,GAAIF,EAAGE,EAAG,MAI7CS,MAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG9C,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAM,EAAA,CAAC,EAAE,KAAK,CAAG,EAAA,CAAC,EAAE,IAAI1K,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE2K,EAAOC,GAAAA,IAAM5K,EAAE6K,EAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGzK,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGE,EAAOC,GAAAA,IAAM1K,EAAEgL,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG3K,EAAI,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK1K,EAAEgL,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG3K,EAAI,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,GAAGrK,EAAI,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK1K,EAAEgL,EAAI,CAAC,EAAE,KAAKhL,EAAEiL,EAAI,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,MAAMjL,EAAEiL,EAAI,CAAC,EAAE,KAAKjL,EAAEiL,EAAI,CAAC,EAAE,KAAKjL,EAAEiL,EAAI,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,MAAMjL,EAAEgL,EAAI,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,MAAMhL,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,KAAKA,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAK,CAAI,GAAA,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,MAAMlL,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG7K,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAO,GAAA,CAAC,EAAE,KAAK,CAAI,GAAA,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAI,GAAA,CAAC,EAAE,KAAK1K,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,KAAK,CAAI,GAAA,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAGK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAG,EAAA,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK1K,EAAEgL,EAAI,CAAC,EAAE,IAAI,CAAC,GAAG3K,EAAI,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,GAAGrK,EAAI,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK1K,EAAEgL,EAAI,CAAC,EAAE,KAAKhL,EAAEgL,EAAI,CAAC,EAAE,KAAKhL,EAAEgL,EAAI,CAAC,EAAE,KAAK,CAAC,GAAG3K,EAAI,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGX,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,GAAG/J,EAAI,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAGX,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAEO,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAED,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGvK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAEC,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAED,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGvK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAG,EAAA,CAAC,EAAE,KAAK1K,EAAE6K,EAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGzK,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGE,EAAOC,GAAAA,IAAM1K,EAAE6K,EAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGzK,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGE,EAAOC,GAAAA,IAAM1K,EAAEgL,EAAI,CAAC,EAAE,IAAIhL,EAAEgL,EAAI,CAAC,EAAE,KAAKhL,EAAEiL,EAAI,CAAC,EAAE,KAAKjL,EAAEiL,EAAI,CAAC,EAAE,KAAKjL,EAAEgL,EAAI,CAAC,EAAE,KAAK,CAAC,EAAEL,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK5K,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAK,CAAC,EAAEP,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAED,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAED,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAED,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK5K,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAK,CAAC,EAAEP,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAG,EAAA,CAAC,EAAE,IAAI,CAAI,GAAA,CAAC,EAAE,KAAK5K,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAK,CAAI,GAAA,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG7K,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAGrK,EAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAGC,EAAI,GAAG,EAAE,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAGsJ,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAG,GAAG,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAI,GAAGC,EAAOC,GAAAA,GAAK,CAAC,EAAEC,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK,CAAC,EAAED,EAAI,GAAGC,EAAO,GAAA,CAAC,EAAE,KAAK5K,EAAEkL,EAAI,CAAC,EAAE,KAAKlL,EAAEkL,EAAI,CAAC,EAAE,MAChoM9H,eAAgB,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,GAAM,GAAA,CAAC,EAAE,IAClDC,WAAY,SAAqBC,EAAKC,GAC9BA,IAAAA,EAAKC,YAGL,MAAM,IAAIC,MAAMH,GAFX5C,KAAAA,MAAM4C,IAKnBI,MAAO,SAAeC,GACdC,IAAAA,EAAOhB,KAAMiB,EAAQ,CAAC,GAAiBC,EAAS,CAAC,MAAOC,EAAS,GAAIZ,EAAQP,KAAKO,MAAOf,EAAS,GAAIE,EAAW,EAAGD,EAAS,EAAmB2B,EAAS,EAAG/C,EAAM,EAClKgD,EAAOF,EAAOG,MAAMC,KAAKC,UAAW,GACpCC,EAAQC,OAAOC,OAAO3B,KAAKyB,OAC3BG,EAAc,CAAE7D,GAAI,IACxB,IAAK,IAAIV,KAAK2C,KAAKjC,GACX2D,OAAOG,UAAUC,eAAeP,KAAKvB,KAAKjC,GAAIV,KAC9CuE,EAAY7D,GAAGV,GAAK2C,KAAKjC,GAAGV,IAGpCoE,EAAMM,SAAShB,EAAOa,EAAY7D,IAClC6D,EAAY7D,GAAG0D,MAAQA,EACvBG,EAAY7D,GAAGZ,OAAS6C,UACG,IAAhByB,EAAMO,SACbP,EAAMO,OAAS,IAEnB,IAAIC,EAAQR,EAAMO,OAClBb,EAAOe,KAAKD,GACRE,IAAAA,EAASV,EAAMW,SAAWX,EAAMW,QAAQD,OAYxC,SAASE,IACL,IAAIC,EAKJ,MAHqB,iBADrBA,EAAQb,EAAMY,OAAShE,KAEnBiE,EAAQtB,EAAKhD,SAASsE,IAAUA,GAE7BA,EAjB0B,mBAA9BV,EAAY7D,GAAG0C,WACtBT,KAAKS,WAAamB,EAAY7D,GAAG0C,WAE5BA,KAAAA,WAAaiB,OAAOa,eAAevC,MAAMS,WAiBlD,IADA,IAAI+B,EAAwBC,EAAOC,EAAWC,EAAeC,EAAGC,EAAKC,EAAUC,EAA9BC,EAAQ,KAC5C,CAUG,GATZP,EAAQxB,EAAMA,EAAMzD,OAAS,GACzBwC,KAAKQ,eAAeiC,GACpBC,EAAS1C,KAAKQ,eAAeiC,IAEzBD,MAAAA,IACAA,EAASH,KAEbK,EAASnC,EAAMkC,IAAUlC,EAAMkC,GAAOD,SAER,IAAXE,IAA2BA,EAAOlF,SAAWkF,EAAO,GAAI,CACnEO,IAAAA,EAAS,GAEb,IAAKL,KADLG,EAAW,GACDxC,EAAMkC,GACRzC,KAAKX,WAAWuD,IAAMA,EAAIxB,GAC1B2B,EAASb,KAAK,IAAOlC,KAAKX,WAAWuD,GAAK,KAI9CK,EADAxB,EAAMyB,aACG,wBAA0BxD,EAAW,GAAK,MAAQ+B,EAAMyB,eAAiB,eAAiBH,EAASI,KAAK,MAAQ,WAAcnD,KAAKX,WAAWmD,IAAWA,GAAU,IAEnK,wBAA0B9C,EAAW,GAAK,iBAAmB8C,GAAUnE,EAAM,eAAiB,KAAQ2B,KAAKX,WAAWmD,IAAWA,GAAU,KAEnJ/B,KAAAA,WAAWwC,EAAQ,CACpBG,KAAM3B,EAAM4B,MACZf,MAAOtC,KAAKX,WAAWmD,IAAWA,EAClCc,KAAM7B,EAAM/B,SACZ6D,IAAKtB,EACLc,SAAUA,IAGtB,GAAIL,EAAO,aAAcc,OAASd,EAAOlF,OAAS,EACxC,MAAA,IAAIqD,MAAM,oDAAsD4B,EAAQ,YAAcD,GAExFE,OAAAA,EAAO,IACf,KAAK,EACDzB,EAAMiB,KAAKM,GACXtB,EAAOgB,KAAKT,EAAMjC,QAClB2B,EAAOe,KAAKT,EAAMO,QAClBf,EAAMiB,KAAKQ,EAAO,IAClBF,EAAS,KAEL/C,EAASgC,EAAMhC,OACfD,EAASiC,EAAMjC,OACfE,EAAW+B,EAAM/B,SACjBuC,EAAQR,EAAMO,OAQlB,MACJ,KAAK,EAwBD,GAvBAa,EAAM7C,KAAKV,aAAaoD,EAAO,IAAI,GACnCM,EAAM/C,EAAIiB,EAAOA,EAAO1D,OAASqF,GACjCG,EAAMnD,GAAK,CACP4D,WAAYtC,EAAOA,EAAO3D,QAAUqF,GAAO,IAAIY,WAC/CC,UAAWvC,EAAOA,EAAO3D,OAAS,GAAGkG,UACrCC,aAAcxC,EAAOA,EAAO3D,QAAUqF,GAAO,IAAIc,aACjDC,YAAazC,EAAOA,EAAO3D,OAAS,GAAGoG,aAEvCzB,IACAa,EAAMnD,GAAGgE,MAAQ,CACb1C,EAAOA,EAAO3D,QAAUqF,GAAO,IAAIgB,MAAM,GACzC1C,EAAOA,EAAO3D,OAAS,GAAGqG,MAAM,UAYvB,KATjBlB,EAAI3C,KAAKT,cAAcuE,MAAMd,EAAO,CAChCxD,EACAC,EACAC,EACAkC,EAAY7D,GACZ2E,EAAO,GACPxB,EACAC,GACFf,OAAOiB,KAEL,OAAOsB,EAEPE,IACA5B,EAAQA,EAAMK,MAAM,GAAI,EAAIuB,EAAM,GAClC3B,EAASA,EAAOI,MAAM,GAAI,EAAIuB,GAC9B1B,EAASA,EAAOG,MAAM,GAAI,EAAIuB,IAElC5B,EAAMiB,KAAKlC,KAAKV,aAAaoD,EAAO,IAAI,IACxCxB,EAAOgB,KAAKc,EAAM/C,GAClBkB,EAAOe,KAAKc,EAAMnD,IAClBiD,EAAWvC,EAAMU,EAAMA,EAAMzD,OAAS,IAAIyD,EAAMA,EAAMzD,OAAS,IAC/DyD,EAAMiB,KAAKY,GACX,MACJ,KAAK,EACD,OAAO,GAGf,OAAO,IAGPrB,EACS,CAEbpD,IAAI,EAEJoC,WAAW,SAAoBC,EAAKC,GAC5B,IAAIX,KAAKjC,GAAGZ,OAGR,MAAM,IAAI0D,MAAMH,GAFX3C,KAAAA,GAAGZ,OAAOsD,WAAWC,EAAKC,IAO3CoB,SAAS,SAAUhB,EAAOhD,GAiBlB,OAhBAiC,KAAKjC,GAAKA,GAAMiC,KAAKjC,IAAM,GACtBgG,KAAAA,OAAShD,EACTiD,KAAAA,MAAQhE,KAAKiE,WAAajE,KAAKkE,MAAO,EAC3ClE,KAAKN,SAAWM,KAAKP,OAAS,EACzBD,KAAAA,OAASQ,KAAKmE,QAAUnE,KAAKqD,MAAQ,GAC1CrD,KAAKoE,eAAiB,CAAC,WACvBpE,KAAKgC,OAAS,CACVyB,WAAY,EACZE,aAAc,EACdD,UAAW,EACXE,YAAa,GAEb5D,KAAKoC,QAAQD,SACRH,KAAAA,OAAO6B,MAAQ,CAAC,EAAE,IAEtBQ,KAAAA,OAAS,EACPrE,MAIfe,MAAM,WACE,IAAIuD,EAAKtE,KAAK+D,OAAO,GAkBrB,OAjBKvE,KAAAA,QAAU8E,EACftE,KAAKP,SACLO,KAAKqE,SACAhB,KAAAA,OAASiB,EACTH,KAAAA,SAAWG,EACJA,EAAGjB,MAAM,oBAEjBrD,KAAKN,WACAsC,KAAAA,OAAO0B,aAEP1B,KAAAA,OAAO4B,cAEZ5D,KAAKoC,QAAQD,QACbnC,KAAKgC,OAAO6B,MAAM,KAGjBE,KAAAA,OAAS/D,KAAK+D,OAAOzC,MAAM,GACzBgD,GAIfC,MAAM,SAAUD,GACR,IAAIzB,EAAMyB,EAAG9G,OACTgH,EAAQF,EAAGG,MAAM,iBAErBzE,KAAK+D,OAASO,EAAKtE,KAAK+D,OACxB/D,KAAKR,OAASQ,KAAKR,OAAOkF,OAAO,EAAG1E,KAAKR,OAAOhC,OAASqF,GAEpDwB,KAAAA,QAAUxB,EACX8B,IAAAA,EAAW3E,KAAKqD,MAAMoB,MAAM,iBAChCzE,KAAKqD,MAAQrD,KAAKqD,MAAMqB,OAAO,EAAG1E,KAAKqD,MAAM7F,OAAS,GACtDwC,KAAKmE,QAAUnE,KAAKmE,QAAQO,OAAO,EAAG1E,KAAKmE,QAAQ3G,OAAS,GAExDgH,EAAMhH,OAAS,IACfwC,KAAKN,UAAY8E,EAAMhH,OAAS,GAEpC,IAAImF,EAAI3C,KAAKgC,OAAO6B,MAgBpB,OAdA7D,KAAKgC,OAAS,CACVyB,WAAYzD,KAAKgC,OAAOyB,WACxBC,UAAW1D,KAAKN,SAAW,EAC3BiE,aAAc3D,KAAKgC,OAAO2B,aAC1BC,YAAaY,GACRA,EAAMhH,SAAWmH,EAASnH,OAASwC,KAAKgC,OAAO2B,aAAe,GAC5DgB,EAASA,EAASnH,OAASgH,EAAMhH,QAAQA,OAASgH,EAAM,GAAGhH,OAChEwC,KAAKgC,OAAO2B,aAAed,GAG7B7C,KAAKoC,QAAQD,SACbnC,KAAKgC,OAAO6B,MAAQ,CAAClB,EAAE,GAAIA,EAAE,GAAK3C,KAAKP,OAASoD,IAEpD7C,KAAKP,OAASO,KAAKR,OAAOhC,OACnBwC,MAIf4E,KAAK,WAEG,OADKZ,KAAAA,OAAQ,EACNhE,MAIf6E,OAAO,WACC,OAAI7E,KAAKoC,QAAQ0C,iBACRb,KAAAA,YAAa,EASfjE,MAPIA,KAAKS,WAAW,0BAA4BT,KAAKN,SAAW,GAAK,mIAAqIM,KAAKkD,eAAgB,CAC9NE,KAAM,GACNd,MAAO,KACPgB,KAAMtD,KAAKN,YAQ3BqF,KAAK,SAAUC,GACFT,KAAAA,MAAMvE,KAAKqD,MAAM/B,MAAM0D,KAIpCC,UAAU,WACF,IAAIC,EAAOlF,KAAKmE,QAAQO,OAAO,EAAG1E,KAAKmE,QAAQ3G,OAASwC,KAAKqD,MAAM7F,QAC5D,OAAC0H,EAAK1H,OAAS,GAAK,MAAM,IAAM0H,EAAKR,QAAQ,IAAIS,QAAQ,MAAO,KAI/EC,cAAc,WACFC,IAAAA,EAAOrF,KAAKqD,MAIT,OAHHgC,EAAK7H,OAAS,KACd6H,GAAQrF,KAAK+D,OAAOW,OAAO,EAAG,GAAGW,EAAK7H,UAElC6H,EAAKX,OAAO,EAAE,KAAOW,EAAK7H,OAAS,GAAK,MAAQ,KAAK2H,QAAQ,MAAO,KAIpFjC,aAAa,WACL,IAAIoC,EAAMtF,KAAKiF,YACXM,EAAI,IAAI/B,MAAM8B,EAAI9H,OAAS,GAAG2F,KAAK,KAChCmC,OAAAA,EAAMtF,KAAKoF,gBAAkB,KAAOG,EAAI,KAIvDC,WAAW,SAASnC,EAAOoC,GACnB,IAAInD,EACAkC,EACAkB,EAwDJ,GAtDI1F,KAAKoC,QAAQ0C,kBAEbY,EAAS,CACLhG,SAAUM,KAAKN,SACfsC,OAAQ,CACJyB,WAAYzD,KAAKgC,OAAOyB,WACxBC,UAAW1D,KAAK0D,UAChBC,aAAc3D,KAAKgC,OAAO2B,aAC1BC,YAAa5D,KAAKgC,OAAO4B,aAE7BpE,OAAQQ,KAAKR,OACb6D,MAAOrD,KAAKqD,MACZsC,QAAS3F,KAAK2F,QACdxB,QAASnE,KAAKmE,QACd1E,OAAQO,KAAKP,OACb4E,OAAQrE,KAAKqE,OACbL,MAAOhE,KAAKgE,MACZD,OAAQ/D,KAAK+D,OACbhG,GAAIiC,KAAKjC,GACTqG,eAAgBpE,KAAKoE,eAAe9C,MAAM,GAC1C4C,KAAMlE,KAAKkE,MAEXlE,KAAKoC,QAAQD,SACbuD,EAAO1D,OAAO6B,MAAQ7D,KAAKgC,OAAO6B,MAAMvC,MAAM,MAItDkD,EAAQnB,EAAM,GAAGA,MAAM,sBAEnBrD,KAAKN,UAAY8E,EAAMhH,QAE3BwC,KAAKgC,OAAS,CACVyB,WAAYzD,KAAKgC,OAAO0B,UACxBA,UAAW1D,KAAKN,SAAW,EAC3BiE,aAAc3D,KAAKgC,OAAO4B,YAC1BA,YAAaY,EACAA,EAAMA,EAAMhH,OAAS,GAAGA,OAASgH,EAAMA,EAAMhH,OAAS,GAAG6F,MAAM,UAAU,GAAG7F,OAC5EwC,KAAKgC,OAAO4B,YAAcP,EAAM,GAAG7F,QAEpDwC,KAAKR,QAAU6D,EAAM,GACrBrD,KAAKqD,OAASA,EAAM,GACfsC,KAAAA,QAAUtC,EACfrD,KAAKP,OAASO,KAAKR,OAAOhC,OACtBwC,KAAKoC,QAAQD,SACbnC,KAAKgC,OAAO6B,MAAQ,CAAC7D,KAAKqE,OAAQrE,KAAKqE,QAAUrE,KAAKP,SAErDuE,KAAAA,OAAQ,EACRC,KAAAA,YAAa,EAClBjE,KAAK+D,OAAS/D,KAAK+D,OAAOzC,MAAM+B,EAAM,GAAG7F,QACzCwC,KAAKmE,SAAWd,EAAM,GACtBf,EAAQtC,KAAKT,cAAcgC,KAAKvB,KAAMA,KAAKjC,GAAIiC,KAAMyF,EAAczF,KAAKoE,eAAepE,KAAKoE,eAAe5G,OAAS,IAChHwC,KAAKkE,MAAQlE,KAAK+D,SACbG,KAAAA,MAAO,GAEZ5B,EACA,OAAOA,EACJ,GAAItC,KAAKiE,WAAY,CAExB,IAAK,IAAI5G,KAAKqI,EACV1F,KAAK3C,GAAKqI,EAAOrI,GAEd,OAAA,EAEX,OAAO,GAIfgI,KAAK,WACO,GAAArF,KAAKkE,KACL,OAAOlE,KAAK3B,IAMhB,IAAIiE,EACAe,EACAuC,EACAC,EAPC7F,KAAK+D,SACDG,KAAAA,MAAO,GAOXlE,KAAKgE,QACDxE,KAAAA,OAAS,GACT6D,KAAAA,MAAQ,IAGjB,IADA,IAAIyC,EAAQ9F,KAAK+F,gBACRC,EAAI,EAAGA,EAAIF,EAAMtI,OAAQwI,IAE9B,IADAJ,EAAY5F,KAAK+D,OAAOV,MAAMrD,KAAK8F,MAAMA,EAAME,SAC5B3C,GAASuC,EAAU,GAAGpI,OAAS6F,EAAM,GAAG7F,QAAS,CAGhE,GAFA6F,EAAQuC,EACRC,EAAQG,EACJhG,KAAKoC,QAAQ0C,gBAAiB,CAE1BxC,IAAU,KADdA,EAAQtC,KAAKwF,WAAWI,EAAWE,EAAME,KAErC,OAAO1D,EACJ,GAAItC,KAAKiE,WAAY,CACxBZ,GAAQ,EACR,SAGA,OAAO,EAER,IAAKrD,KAAKoC,QAAQ6D,KACrB,MAIZ,OAAI5C,GAEc,KADdf,EAAQtC,KAAKwF,WAAWnC,EAAOyC,EAAMD,MAE1BvD,EAKK,KAAhBtC,KAAK+D,OACE/D,KAAK3B,IAEL2B,KAAKS,WAAW,0BAA4BT,KAAKN,SAAW,GAAK,yBAA2BM,KAAKkD,eAAgB,CACpHE,KAAM,GACNd,MAAO,KACPgB,KAAMtD,KAAKN,YAM3B2C,IAAI,WACI,IAAIM,EAAI3C,KAAKqF,OACb,OAAI1C,GAGO3C,KAAKqC,OAKxB6D,MAAM,SAAgBC,GACdnG,KAAKoE,eAAelC,KAAKiE,IAIjCC,SAAS,WAEGpB,OADIhF,KAAKoE,eAAe5G,OAAS,EAC7B,EACGwC,KAAKoE,eAAeiC,MAEpBrG,KAAKoE,eAAe,IAKvC2B,cAAc,WACN,OAAI/F,KAAKoE,eAAe5G,QAAUwC,KAAKoE,eAAepE,KAAKoE,eAAe5G,OAAS,GACxEwC,KAAKsG,WAAWtG,KAAKoE,eAAepE,KAAKoE,eAAe5G,OAAS,IAAIsI,MAErE9F,KAAKsG,WAAL,QAA2BR,OAK9CS,SAAS,SAAmBvB,GAEhBA,OADJA,EAAIhF,KAAKoE,eAAe5G,OAAS,EAAIgJ,KAAKC,IAAIzB,GAAK,KAC1C,EACEhF,KAAKoE,eAAeY,GAEpB,WAKnB0B,UAAU,SAAoBP,GACjBD,KAAAA,MAAMC,IAInBQ,eAAe,WACA,OAAA3G,KAAKoE,eAAe5G,QAEnC4E,QAAS,CAAQ6D,MAAA,GACjB1G,cAAe,SAAmBxB,EAAG6I,EAAIC,EAA0BC,GAEnE,OAAOD,GACP,KAAK,EAEL,KAAK,EAEL,KAAK,EACL,MACA,KAAK,EAAE,MAAO,MAEd,KAAK,EAAE,MAAO,QAEd,KAAK,EAoBL,KAAK,GAAG,MAAO,IAlBf,KAAK,EAEL,KAAK,EAEL,KAAK,EAEL,KAAK,EAAE,MAAO,IAEd,KAAK,GAEL,KAAK,GAAG,MAAO,IAEf,KAAK,GAEL,KAAK,GAAG,MAAO,IAEf,KAAK,GAAG,MAAO,IAIf,KAAK,GAIL,KAAK,GAAG,MAAO,IAFf,KAAK,GAIL,KAAK,GAAG,MAAO,IAEf,KAAK,GAAG,MAAO,IAEf,KAAK,GAAG,MAAO,IAEf,KAAK,GAIL,KAAK,GAAG,MAAO,IAFf,KAAK,GAIL,KAAK,GAAG,MAAO,IAEf,KAAK,GAAG,MAAO,IAEf,KAAK,GAAG,MAAO,IAEf,KAAK,GAAG,MAAO,QAEf,KAAK,GAAG,MAAO,SAEf,KAAK,GAAG,MAAO,IAEf,KAAK,GAAG,MAAO,OAEf,KAAK,GAIL,KAAK,GAYL,KAAK,GAAsB,OAAnBD,EAAIpH,OAAS,KAAa,OAdlC,KAAK,GAIL,KAAK,GAYL,KAAK,GAAsB,OAAnBoH,EAAIpH,OAAS,KAAa,OAVlC,KAAK,GAEL,KAAK,GAEL,KAAK,GAEL,KAAK,GAAsB,OAAnBoH,EAAIpH,OAAS,KAAa,OAMlC,KAAK,GAEL,KAAK,GAAG,MAAO,OAEf,KAAK,GAAG,MAAO,OAEf,KAAK,GAAG,MAAO,MAEf,KAAK,GAAG,MAAO,KAEf,KAAK,GAAG,MAAO,MAEf,KAAK,GAEL,KAAK,GAEL,KAAK,GAEL,KAAK,GAAG,MAAO,OAEf,KAAK,GAAuB,OAApBoH,EAAIpH,OAAS,MAAc,OAEnC,KAAK,GAAuB,OAApBoH,EAAIpH,OAAS,MAAc,OAEnC,KAAK,GAAuB,OAApBoH,EAAIpH,OAAS,MAAc,OAEnC,KAAK,GAAuB,OAApBoH,EAAIpH,OAAS,MAAc,OAEnC,KAAK,GAAuB,OAApBoH,EAAIpH,OAAS,MAAc,OAEnC,KAAK,GAAuB,OAApBoH,EAAIpH,OAAS,MAAc,OAEnC,KAAK,GAA0B,OAAvBoH,EAAIpH,OAAS,SAAiB,OAEtC,KAAK,GAA0B,OAAvBoH,EAAIpH,OAAS,SAAiB,OAEtC,KAAK,GAA0B,OAAvBoH,EAAIpH,OAAS,SAAiB,OAEtC,KAAK,GAA0B,OAAvBoH,EAAIpH,OAAS,SAAiB,OAEtC,KAAK,GAA0B,OAAvBoH,EAAIpH,OAAS,SAAiB,OAEtC,KAAK,GAA0B,OAAvBoH,EAAIpH,OAAS,SAAiB,OAEtC,KAAK,GAEL,KAAK,GAAG,MAAO,UAEf,KAAK,GAAwB,OAArBoH,EAAIpH,OAAS,OAAe,OAEpC,KAAK,GAAwB,OAArBoH,EAAIpH,OAAS,OAAe,OAEpC,KAAK,GAML,KAAK,GAAwB,OAArBoH,EAAIpH,OAAS,OAAe,OAJpC,KAAK,GAAwB,OAArBoH,EAAIpH,OAAS,OAAe,OAEpC,KAAK,GAAwB,OAArBoH,EAAIpH,OAAS,OAAe,OAIpC,KAAK,GAAG,MAAO,QAEf,KAAK,GAEL,KAAK,GAAsB,OAAnBoH,EAAIpH,OAAS,KAAa,QAElC,KAAK,GAML,KAAK,GAAG,MAAO,MAJf,KAAK,GAEL,KAAK,GAAyB,OAAtBoH,EAAIpH,OAAS,QAAgB,MAIrC,KAAK,GAEL,KAAK,GAAuB,OAApBoH,EAAIpH,OAAS,MAAc,MAEnC,KAAK,GAAG,OAAOzB,EAAG0N,YAAY7E,EAAIpH,QAElC,KAAK,GAAG,MAAO,MAEf,KAAK,GAAG,MAAO,UAEf,KAAK,GAAGkM,QAAQtC,IAAIxC,EAAIpH,UAIxBsG,MAAO,CAAC,WAAW,eAAe,WAAW,iBAAiB,yBAAyB,YAAY,UAAU,gBAAgB,iBAAiB,aAAa,UAAU,eAAe,SAAS,SAAS,UAAU,UAAU,UAAU,UAAU,gBAAgB,iBAAiB,UAAU,UAAU,UAAU,UAAU,gBAAgB,iBAAiB,SAAS,UAAU,gBAAgB,iBAAiB,UAAU,sBAAsB,YAAY,YAAY,aAAa,aAAa,YAAY,YAAY,aAAa,SAAS,SAAS,SAAS,cAAc,eAAe,mBAAmB,iBAAiB,eAAe,iBAAiB,mBAAmB,mBAAmB,sBAAsB,sBAAsB,aAAa,aAAa,aAAa,aAAa,aAAa,aAAa,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,4BAA4B,4BAA4B,cAAc,cAAc,cAAc,cAAc,cAAc,cAAc,UAAU,SAAS,YAAY,aAAa,SAAS,eAAe,WAAW,SAAS,aAAa,gBAAgB,SAAS,SAAS,UAClpCQ,WAAY,CAAWS,QAAA,CAACjB,MAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAgBkB,WAAA,KAKnS,SAASC,IACFlJ,KAAAA,GAAK,GAGL,OALPZ,EAAOsE,MAAQA,EAIfwF,EAAOpF,UAAY1E,EAAOA,EAAO8J,OAASA,EACnC,IAAIA,EAxvBG,GCrCV0E,EAAW,WAEX,MAAM,IAAI9K,MAAM,6CACRb,KAAK4L,UAIb3N,EAAQ,SAAS4N,GAAW,MAAM,IAAIhL,MAAMgL,IAG5CC,EAAQ,SAASC,GAAiBA,OAAAA,GAAWA,GAejD,SAASC,KA0ZT,SAASC,KA+GF,SAAS9B,IAERnK,KAAKkM,MADgB,IAArB1K,UAAUhE,OACGgE,UAAU,GAEV6H,EAAE8C,QAAQ3K,WA+HxB,SAAS6I,IAERrK,KAAKkM,MADgB,IAArB1K,UAAUhE,OACGgE,UAAU,GAEV6H,EAAE8C,QAAQ3K,WA2pBxB,SAASqJ,EAAIuB,EAAMC,GAAYD,KAAAA,KAAOA,EAAWC,KAAAA,IAAMA,EAkZvD,SAAS5B,EAAI2B,EAAM7C,GAAc6C,KAAAA,KAAOA,EAAW7C,KAAAA,MAAQA,EAsH3D,SAASqB,EAAK7K,EAAMuM,GAAYvM,KAAAA,KAAOA,EAAWuM,KAAAA,IAAMA,EA0SxD,SAASf,EAAIe,GAAYA,KAAAA,IAAMA,EAmE/B,SAASpC,EAAGqC,EAAMxM,EAAMyM,GACtBD,KAAAA,KAAOA,EACPxM,KAAAA,KAAOA,EACPyM,KAAAA,MAAQA,EAkPjB,SAASC,KAkBF,SAASjB,EAAKhJ,EAAQ8J,GACpB9J,KAAAA,OAASA,EAAa8J,KAAAA,IAAMA,EAsD9B,SAASxB,EAAItI,EAAQkK,GACnBlK,KAAAA,OAASA,EACTkK,KAAAA,UAAYA,EAwDd,SAAS3B,EAAMvI,GAAeA,KAAAA,OAASA,EAwD9C,SAASmK,KAwEF,SAASC,EAASC,EAAWC,GAC5B9H,IAAAA,EAAI6H,EAAeE,EAAID,EACvBC,EAAI,IACJ/H,GAAKA,EAAG+H,GAAKA,GAEZ/H,KAAAA,EAAIA,EAAQ+H,KAAAA,EAAIA,EAoGlB,SAAS9B,EAAI+B,GAAehI,KAAAA,EAAIgI,EAyBhC,SAAS7B,EAAM6B,GAAehI,KAAAA,EAAIgI,EAxxFzC3D,EAAE4D,OAAOjB,EAAKnK,UAAW,CAGrBqL,KAAMvB,EAGNtK,KAAMsK,EAGNwB,UAAW,SAAS9L,GAChB,IAAI+L,EAAW,IAAIpN,KAAKkN,KAExB,OADAlN,KAAKkN,KAAKpJ,MAAMsJ,EAAU/L,GACnB+L,GAIXC,QAAS,SAASC,GACd,IAAIC,EAAS/J,MAAM3B,UAAUP,MAAMC,KAAKC,UAAW,GAC/CH,EAAOgI,EAAEmE,IAAIxN,KAAKqB,QAAQ,SAASiL,GACnC,OAAOjD,EAAEoE,SAASnB,GAAOA,EAAMA,EAAIgB,GAAQxJ,MAAMwI,EAAKiB,MAE1D,OAAOvN,KAAKmN,UAAU9L,IAI1BqM,KAAM/B,EAENgC,QAAShC,EAETiC,QAAS,WACL,IAAIC,EAAO7N,KAAK2N,UACZ,IACO,OAAA,IAAIG,SAAS,OAAQ,UAAYD,EAAO,KACjD,MAAOE,GACL,MAAM,IAAIlN,MAAM,6BAA+BgN,KAOvDjC,MAAOD,EAGPqC,IAAKrC,EAGLsC,MAAO,SAAS7L,GAEZA,EAAUA,GAAW,GACrBiH,EAAE6E,SAAS9L,EAAS,CAChB+L,SAAS,EACTC,SAAS,EACTC,OAAO,IAGX,IAAIL,EAAMhO,KAAKgO,MAaf,OAXI5L,EAAQ+L,UACRH,EAAM,kBAAoBA,GAE1B5L,EAAQgM,UAERJ,GADAA,EAAMA,EAAI7I,QAAQ,MAAO,YACfA,QAAQ,MAAO,aAEzB/C,EAAQiM,QACRL,EAAMA,EAAI7I,QAAQ,UAAW,YAG1B6I,GAKX3N,KAAM,WACF,OAAIL,KAAKkN,KAAK7M,KACHL,KAAKkN,KAAK7M,KAEVL,KAAKkN,KAAKoB,WAAWjL,MAAM,yBAAyB,IAKnEkL,KAAM,WACF,OAAOvO,KAAKK,OAAS,IAAMgJ,EAAEmE,IAAIxN,KAAKqB,QAAQ,SAASiL,GAC5CjD,OAAAA,EAAEoE,SAASnB,GAAOA,EAAMA,EAAIiC,UACpCpL,KAAK,KAAO,KAInBqL,MAAO,WAAa,OAAOxO,KAAKqN,QAAQ,UAGxCoB,UAAW,WAAa,OAAOzO,KAAKqN,QAAQ,cAG5CqB,OAAQ,WAAa,OAAO1O,KAAKqN,QAAQ,WAGzCsB,OAAQ,SAASvM,GAAW,OAAOpC,KAAKqN,QAAQ,SAAUjL,IAG1DwM,QAAS,SAASxM,GAAW,OAAOpC,KAAKqN,QAAQ,UAAWjL,IAG5DyM,OAAQ,SAASC,GACN,OAAA9O,KAAKyO,YAAY7C,UAAYkD,EAAML,YAAY7C,SAI1DmD,SAAU,SAAS3M,GACfA,EAAUiH,EAAE4D,OAAO,CACf+B,MAAM,GACP5M,GAGH,IAAI6M,EAAQjP,KAAK2O,OAAOvM,GACpB8M,EAAQD,EAAML,QAAQxM,GAGtB6M,EAAMJ,OAAOK,KACbA,EAAQlP,KAAK4O,QAAQxM,IAIzB,IAAI+M,EAAQD,EAAMR,OAAOtM,GACrBgN,EAAQD,EAAMP,QAAQxM,GAGtB+M,EAAMN,OAAOO,KACbA,EAAQF,EAAMN,QAAQxM,IAItBiN,IAAAA,EAAaD,EAEbhN,OAAAA,EAAQ4M,MAAQhP,KAAK6O,OAAOQ,GACrBA,EAEAA,EAAWN,SAAS3M,IAKnCkN,aAAc,WACV,OAAOtP,KAAK6O,OAAO7O,KAAK+O,aAI5BQ,SAAU,WACClG,OAAAA,EAAEmG,OAAOxP,KAAKqB,QAAQ,SAASiL,GAC3BA,OAAAA,aAAeN,MAK9ByD,QAAS,SAASC,GACPrG,OAAAA,EAAEsG,KAAKtG,EAAEuG,QAAQvG,EAAEwG,OAAO7P,KAAKuP,WAAY,UAAWG,KAAeI,QAGhFC,UAAW,WACA1G,OAAAA,EAAEsG,KAAKtG,EAAEuG,QAAQvG,EAAEwG,OAAO7P,KAAKuP,WAAY,eAAeO,QAGrEE,SAAU,WACN,OAAO3G,EAAEuG,QAAQvG,EAAEwG,OAAO7P,KAAKuP,WAAY,cAI/CU,GAAI,SAAS/C,GACT,OAAOlN,gBAAgBkN,GAI3BgD,IAAK,SAAShD,GACN,OAAAlN,gBAAgBkN,GAGb7D,EAAE8G,IAAInQ,KAAKuP,YAAY,SAASjD,GAAO,OAAOA,EAAI4D,IAAIhD,OAKjEkD,WAAY,SAAS/D,GACjB,OAAO,IAAIxB,EAAI7K,KAAMqM,IAKzBgE,WAAY,WAAa,OAAO,GAChCC,SAAW,WAAa,OAAO,GAC/BC,OAAS,WAAa,OAAO,GAG7BC,iBAAkB,WACd,OAAOxQ,KAAKqB,OAAO,GAAGmP,oBAI1BC,SAAU,SAAS3B,GACf,IAAI4B,EAAQ1Q,KAAKyP,UACbkB,EAAQ7B,EAAMW,UAIdmB,EAAO,SAASC,EAAQC,GACjB,OAACzH,EAAE0H,WAAWF,EAAQC,GAAQtT,QAGrCwT,EAAQ,SAASC,GACjB,OAAO5H,EAAEsG,KAAKtG,EAAEwG,OAAOoB,EAAO,gBAAgBnB,QAM3C,MAAA,CAACoB,MAHIN,EAAKF,EAAOC,GAGFQ,kBAFEP,EAAKI,EAAMN,GAAQM,EAAML,MAQrDS,QAAS,SAAStC,GAEVA,GAAAA,aAAiB5E,EACjB,OAAO,EAGX,IAAImH,EAAUhI,EAAEiI,MACZtR,KAAKyP,SAA0B,GAC/BX,EAAMW,SAAN,IAaA8B,EAAe,SAASC,EAAMC,GAC9B,IAAIC,EATO,SAASF,EAAMC,GAC1B,OAAIjL,KAAKC,IAAI+K,GAAQ,GAAKhL,KAAKC,IAAIgL,GAAQ,EAChCjL,KAAKC,IAAI+K,EAAOC,GAEhBjL,KAAKC,IAAI,EAAI+K,EAAOC,GAKnBE,CAASH,EAAMC,GAClBD,OAAAA,IAASC,GACT3F,EAAM0F,IAAS1F,EAAM2F,IACrBC,EAAQlL,KAAKlG,IAAI,IA7PtB,IAiQR,IAAK+Q,EAAQ7T,SAAWwC,KAAKkQ,IAAI0B,KAAU9C,EAAMoB,IAAI0B,GAC1CL,OAAAA,EAAavR,KAAK0N,OAAQoB,EAAMpB,QAM3C,IAAImE,EAAQ7R,KAAK4O,UACbkD,EAAQhD,EAAMF,UAEdmD,EAAY/R,KAAKgQ,WACjBgC,EAAYlD,EAAMkB,WAElB,IAAC3G,EAAE4I,QAAQF,EAAWC,GACtB,OAAO,EAYN,IAAA,IAAIhM,EAAI,EAAGA,EA5RP,GA4RuBA,IAAK,CAEjC,IA0BIkL,EA1BAgB,EAAO,GAGPrO,EAAQ2C,KAAKlG,IAAI,GAAI,EAAIkG,KAAK2L,MAAM,EAAInM,EAjSvC,KAiTDoM,EAAYpM,EAAI,GAAM,EAQtB6L,GANJxI,EAAEgJ,KAAKhB,GAAS,SAAS/T,GAzTnB,IAASgV,EACnBC,EAyTQL,EAAK5U,GAAK8U,GAzTlBG,EAyTkD1O,GA1T/ByO,GA0TwBzO,GAxTxC2C,KAAKgM,SAAWD,EAASD,GAyTEjJ,EAAEmJ,QAAQ3O,EAAOA,MAIvCgO,EAAM3B,IAAI1E,IAASsG,EAAM5B,IAAI1E,IACzBqG,EAAM3B,IAAI0B,IAASE,EAAM5B,IAAI0B,GAAO,CAExC,IAAIa,EAAUZ,EAAMa,YAAYR,GAC5BS,EAAUb,EAAMY,YAAYR,GAEhChB,EAAQuB,EAAQ1D,WAAWF,OAAO8D,EAAQ5D,gBACvC,CAIHmC,EAAQK,EAHJkB,EAAUZ,EAAMnE,KAAKwE,GACrBS,EAAUb,EAAMpE,KAAKwE,IAKzB,IAAChB,EACD,OAAO,EAIf,OAAO,GAIXwB,YAAa,SAASR,GACd,OAAAlS,gBAAgB4R,EACT5R,KACCA,KAAKkQ,IAAI1E,GAEVxL,gBAAgBwL,EAChB,IAAIA,EAAKxL,KAAKwC,OAAQxC,KAAKsM,IAAIoG,YAAYR,IAE3ClS,KAAKqN,QAAQ,cAAe6E,GAJ5B,IAAI/G,EAAMnL,KAAK0N,KAAKwE,GAAMU,QAnV7B,IAmViDhE,WAY7DiE,SAAU,SAAS/D,GACR,OAAA9O,KAAKwO,QAAQK,OAAOC,EAAMN,UAIrCsE,QAAS,SAASnE,GACP,OAAA3O,KAAK6O,OAAOF,GAAUA,EAAShC,EAAIoG,KAI9CC,eAAgB,WACLrG,OAAAA,EAAIoG,KAIfE,MAAO,WACI,OAAA,IAAI5I,EAAIsC,EAAIoG,IAAK/S,OAK5BkT,WAAYvH,EAIZwH,WAAY,WAAa,OAAO,GAGhCC,iBAAkB,WACd,OAAOpT,KAAKkT,aAAelT,KAAO2M,EAAIoG,KAI1C1H,QAAS,SAASgI,GACV,IAACA,EACD,OAAOrT,KAGPsT,IAAAA,EAAOtT,KAAKmN,UAAUnN,KAAKqB,QAG/B,OAFAiS,EAAKC,MAAQlK,EAAEmK,MAAMxT,KAAKuT,OAC1BD,EAAKC,MAAMF,IAAQ,EACZC,GAGXC,MAAO,CACHE,QAAQ,GAIZC,OAAQ,WAAa,OAAO1T,MAG5BoL,cAAe,WAAa,OAAOpL,KAAKqN,QAAQ,kBAEhD5G,IAAKkF,EAELgI,OAAQ,WACG,OAAA,IAAItJ,EAAIsC,EAAIiH,IAAK5T,SAOhCiM,EAAIpK,UAAY,IAAImK,EAEpB3C,EAAE4D,OAAOhB,EAAIpK,UAAW,CACpBR,KAAM,WAAa,OAAOrB,KAAKkM,OAE/BuC,UAAW,WACP,IAAIvC,EAAQ7C,EAAEwK,OAAOxK,EAAEwG,OAAO7P,KAAKkM,MAAO,cAAc,SAAS4H,GACtDA,OAAAA,EAAKlI,WAGhB,OAAO,IAAI5L,KAAKkN,KAAKhB,IAGzBwC,OAAQ,WACJ,OAAO1O,KAAKqN,QAAQ,UAAUuC,WAKlCmE,UAAW,WACH7H,IAAAA,EAAQ7C,EAAE2K,QAAQhU,KAAKkM,OAAO,SAAS4H,GAChCA,OAAAA,aAAgBnH,KAMvBsH,EAAU/H,GAAM,IAAS,GACzBgI,EAAShI,GAAM,IAAU,GAE7B,MAAO,CAAC,IAAIlM,KAAKkN,KAAK+G,GAAU,IAAIjU,KAAKkN,KAAKgH,KAKlDtE,QAAS,WACD7P,IAAAA,EAAOC,KACPkM,EAAQ7C,EAAExE,OAAO7E,KAAKkM,OAAO,SAAS4H,GACtC,OAAOA,EAAKjF,OAAO9O,EAAKoU,aAG5B,GAAqB,IAAjBjI,EAAM1O,OACCuC,OAAAA,EAAKoU,SAEhB,GAAqB,IAAjBjI,EAAM1O,OACC0O,OAAAA,EAAM,GAGbkI,IAAAA,EAAU/K,EAAE2K,QAAQ9H,GAAO,SAAS4H,GACpC,OAAOA,aAAgB/T,EAAKmN,QAI5B0D,EAAOwD,GAAQ,IAAS,GAGxBC,GAFSD,GAAQ,IAAU,IAERhU,OAAOiJ,EAAEuG,QAAQvG,EAAEiL,MAAM1D,EAAM,UAAyB,IAC/E,OAAO,IAAI7Q,EAAKmN,KAAKmH,IAIzBF,cAAUI,EAGVC,OAAQ7I,EAERuH,WAAY,WACJhH,IAAAA,EAAQ7C,EAAEwG,OAAO7P,KAAKkM,MAAO,WACjC,OAAO7C,EAAEoL,IAAIpL,EAAEwG,OAAO3D,EAAO,gBAMjC/G,QAAS,SAASuP,EAASC,GACvB,IAAI9O,EAGAA,EADA6O,aAAmB1I,EACX3C,EAAEuL,QAAQ5U,KAAKkM,MAAOwI,GAEtBA,EAGRG,IAAAA,EAAW,GACXxL,EAAEyL,QAAQH,GACVE,EAAWF,EACJA,IACPE,EAAW,CAACF,IAGZzI,IAAAA,EAAQlM,KAAKkM,MAAM5K,MAAM,EAAGuE,GACnBzF,OAAOyU,GACPzU,OAAOJ,KAAKkM,MAAM5K,MAAMuE,EAAQ,IAE7C,OAAO,IAAI7F,KAAKkN,KAAKhB,IAIzB6I,OAAQ,SAASjB,GACb,OAAO9T,KAAKmF,QAAQ2O,IAGxBd,eAAgB,WAEZ,OAAO,IAAI3I,EAAIhB,EAAEwG,OAAO7P,KAAKkM,MAAO,mBAAmB0D,aAa/DzF,EAAItI,UAAY,IAAIoK,EAEpB5C,EAAE4D,OAAO9C,EAAItI,UAAW,CACpBqL,KAAM/C,EAENuD,KAAM,SAASwE,EAAM9P,GACViH,OAAAA,EAAEmL,OAAOxU,KAAKkM,OAAO,SAAS8I,EAAMlB,GAAekB,OAAAA,EAAOlB,EAAKpG,KAAKwE,EAAM9P,KAAa,IAGlGuL,QAAS,WACEtE,OAAAA,EAAEmE,IAAIxN,KAAKkM,OAAO,SAAS4H,GAC9B,MAAO,IAAMA,EAAKnG,UAAY,OAC/BxK,KAAK,QAAU,KAGtByI,MAAO,WACH,OAAOvC,EAAEwG,OAAO7P,KAAKkM,MAAO,SAAS/I,KAAK,MAG9C6K,IAAK,WACGA,IAAAA,EAAM,GAUV,OARA3E,EAAEgJ,KAAKrS,KAAKkM,OAAO,SAAS4H,IACnB9F,GAAO8F,EAAKzD,aACbrC,GAAO8F,EAAK9F,MAEZA,GAAO,IAAM8F,EAAK9F,SAInBA,GAGXY,QAAS,SAASxM,GACd,IAAI8J,EAAQ7C,EAAEwG,OAAO7P,KAAKkM,MAAO,UAAW9J,GAGxC6S,EAAQ,GAEZ5L,EAAEgJ,KAAKnG,GAAO,SAAS4H,GACfA,GAAAA,aAAgBzJ,EAAK,CACrB,IAAI6K,EAAOpB,EAAKC,YAChBkB,EAAM/S,KAAK,CAACgT,EAAK,GAAGtF,UAAWsF,EAAK,GAAGV,OAAOpS,UACvC0R,aAAgBnH,EACvBsI,EAAM/S,KAAK,CAACyK,EAAIoG,IAAKe,IAErBmB,EAAM/S,KAAK,CAAC4R,EAAMnH,EAAIoG,SAK1BqB,IAAAA,EAAU/K,EAAE2K,QAAQiB,GAAO,SAASE,GAC7BA,OAAAA,EAAK,GAAG1G,YAAY7C,WAG3BwJ,EAAY/L,EAAEgM,QAAQhM,EAAEmE,IAAI4G,GAAS,SAASa,GAC1C3B,IAAAA,EAAO2B,EAAM,GAAG,GAGb,OAAA,IAAI5K,EAFD,IAAIF,EAAId,EAAEiM,IAAIxR,MAAMuF,EAAG4L,GAAO,IAClBT,OAAOpS,GACDkR,GAAM1E,QAAQxM,OAM9C,OAAO,IAAI+H,EAAIiL,GAAWxF,WAK9BjB,OAAQ,SAASvM,GACbA,EAAUiH,EAAE4D,OAAO,CACfsI,cAAc,GACfnT,GAEC8J,IACAsJ,EADAtJ,EAAQ7C,EAAEwG,OAAO7P,KAAKkM,MAAO,WAI7BsJ,EADAtJ,EAAM,aAAc7B,EACV6B,EAAM,GAAGA,MAET,CAACA,EAAM,IAGrB7C,EAAEgJ,KAAKhJ,EAAEoM,KAAKzV,KAAKkM,QAAQ,SAAS4H,GAChC0B,EAAUnM,EAAEmE,IAAIgI,GAAS,SAAS7G,GAC9B,OAAOmF,EAAKhB,QAAQnE,UAIvBvM,EAAQmT,cAAgBvV,KAAKmT,cAC9BqC,EAAQtT,KAAKyK,EAAIiH,KAGrB4B,EAAU,IAAInL,EAAImL,GAAS5F,UAAUhB,UAEjC8G,IAAAA,EAAYrM,EAAEmE,IAAItB,GAAO,SAAS4H,GAC3BzJ,OAAAA,EAAIG,aAAasJ,EAAM0B,GAASzG,cAIpC1E,OAFPqL,EAAY,IAAIvL,EAAIuL,GAAW9F,UAExBvF,EAAID,eAAeoL,EAASE,GAAW9F,WAGlD4E,OAAQ,SAASpS,GACNiH,OAAAA,EAAEmL,OAAOxU,KAAKkM,OAAO,SAAS8I,EAAMlB,GACvC,OAAOkB,EAAKW,IAAI7B,EAAM1R,KACvBpC,KAAKmU,WAGZ3D,iBAAkB,WAAa,OAAO,GAEtC2C,WAAY,WACJjH,IAAAA,EAAQ7C,EAAEwG,OAAO7P,KAAKkM,MAAO,WACjC,OAAO7C,EAAEoL,IAAIpL,EAAEwG,OAAO3D,EAAO,gBAGjCyH,OAAQ,WACJ,OAAO,IAAIxJ,EAAId,EAAEwG,OAAO7P,KAAKkM,MAAO,cAa5C7B,EAAIxI,UAAY,IAAIoK,EAEpB5C,EAAE4D,OAAO5C,EAAIxI,UAAW,CACpBqL,KAAM7C,EAENqD,KAAM,SAASwE,EAAM9P,GACViH,OAAAA,EAAEmL,OAAOxU,KAAKkM,OAAO,SAAS8I,EAAMlB,GAAekB,OAAAA,EAAOlB,EAAKpG,KAAKwE,EAAM9P,KAAa,IAGlGuL,QAAS,WACEtE,OAAAA,EAAEmE,IAAIxN,KAAKkM,OAAO,SAAS4H,GAC9B,MAAO,IAAMA,EAAKnG,UAAY,OAC/BxK,KAAK,QAAU,KAGtByI,MAAO,WACIvC,OAAAA,EAAEmE,IAAIxN,KAAKkM,OAAO,SAAS4H,GAC9B,OAAQA,aAAgB3J,EAAO,IAAM2J,EAAKlI,QAAU,IAAMkI,EAAKlI,WAChEzI,KAAK,MAGZ6M,SAAU,WACN,IAAI4F,EAAUvM,EAAErJ,KAAKkM,OAChB2J,QACArI,KAAI,SAASsG,GACHA,OAAAA,EAAK9D,cAEfJ,UACAkG,QAIL,OAFAF,EAAQ9F,MAAK,CAACiG,EAAGC,IAAMD,EAAE3X,KAAK6X,cAAcD,EAAE5X,QAEvCwX,GAKX5H,IAAK,WAuBD,IAtBIkI,IAiBArJ,EAjBAqJ,EAAO,WAEPhK,EAAQ7C,EAAE2K,QAAQhU,KAAKkM,OAAO,SAAS4H,GACvC,OAAIA,EAAKxD,WACE,UACAwD,aAAgBnH,EAChB,SAEA,WAIXwJ,EAAWjK,EAAMkK,SAAW,GAC5BnC,EAAU/H,EAAMc,QAAU,GAC1BkH,EAAShI,EAAM4C,OAAS,GAExBuH,EAAY,GAMPrQ,EAAI,EAAGA,EAAIiO,EAAQzW,OAAQwI,IAAK,CAGrC,GAFiBiO,EAAQjO,aAAc4G,KACjBqH,EAAQjO,aAAciF,IAC1BiJ,EAAO1W,OAAS,GAAK2Y,EAAS3Y,OAAS,EAAG,CACxD,IAAI8Y,EAAkBrC,EAAQ3S,QAC9BgV,EAAgBC,OAAOvQ,EAAG,GACtB6O,IAAAA,EAAWyB,EAAgBlW,OAAO+V,GAAU/V,OAAO8T,GACvD,OAAOD,EAAQjO,GAAGgI,MAAQ,IAAI3D,EAAIwK,GAAU7G,OAkBhDiG,GAAmB,KAdvBA,EAAU5K,EAAEgM,QAAQhM,EAAEmE,IAAIyG,GAAS,SAASH,GACpC0C,IAAAA,EAAY1C,aAAgBlH,KAAekH,aAAgB7I,GAC3DwL,GAAkB3C,EAAKP,MAAMmD,UAAYP,EAAS3Y,OAAS,EAC3DgZ,GAAAA,GAAYC,EAAgB,CAE5BN,EAASjU,KAAK,IAAI2I,EAAI,IAAII,EAAI6I,EAAK/G,GAAIJ,EAAIgK,MACvC3J,IAAAA,EAAS,IAAI/B,EAAI6I,EAAK9O,GAEnBqE,OADP2D,EAAOuG,MAAQO,EAAKP,MACblK,EAAE8G,IAAI2D,EAAKP,OAASvG,EAAS,KAEpC,OAAO8G,OAIHtW,QAAkC,IAAlB0W,EAAO1W,OAE/BqP,EAAYqH,EAAO,GAAGlG,UACnB,CACCA,IAAAA,EAAM,GAEV3E,EAAEgJ,KAAK4B,GAAS,SAASH,GACjBA,EAAKP,MAAMqD,UAAY9C,EAAKP,MAAMsD,SAClCR,GAAa,IACbrI,IAAQA,EAAMkI,EAAO,IAAMpC,EAAKrN,MAAMuH,OAC9B8F,aAAgB7I,IAAqB,IAAZ6I,EAAK9O,IACrC8O,EAAKP,MAAMI,QAAUG,EAAKP,MAAMqD,UAGjCP,GAAa,IAGbrI,IAAQA,EAAMkI,EAAO,IAAMpC,EAAK9F,SAIxC3E,EAAEgJ,KAAK6B,GAAQ,SAASJ,GAChBA,EAAKtD,mBAELxC,IAAQA,EAAMkI,EAAO,IAAMpC,EAAK9F,MAGhCA,GAFO8F,aAAgB3J,EAEhB,IAAM2J,EAAK9F,MAAQ,IAGnB8F,EAAK9F,SAIpBnB,EAAYmB,GAAY,IAG5B,GAAKmI,EAAS3Y,OAEP,CACH,IAAIsP,EAAc,IAAIzC,EAAIhB,EAAEwG,OAAOsG,EAAU,aAAavG,UAAU5B,MAC7DqI,OAAAA,EAAY,UAAYxJ,EAAY,KAAOC,EAAc,IAHzDuJ,OAAAA,EAAYxJ,GAO3B2B,MAAO,WAIH,OAAO,IAAInE,EAHChB,EAAEmE,IAAIxN,KAAKkM,OAAO,SAAS4H,GACnC,OAAOA,aAAgBnH,EAAMmH,EAAKrN,MAAQqN,EAAKtF,YAE7BoB,WAI1BlB,OAAQ,WAEJ,IAAIoI,EAAQ,SAAShD,GACVA,OAAAA,aAAgB3J,GAGvB4M,EAAY,SAASjD,GACdA,OAAAA,aAAgBjJ,GAAOiJ,EAAKzH,IAAI8G,cAOvC6D,EAAMhX,KAAKqN,QAAQ,UAAUuC,UAE7BqH,EAAS5N,EAAE8G,IAAI6G,EAAI9K,MAAO4K,GAC1BI,EAAgB7N,EAAE8G,IAAI6G,EAAI9K,OAPX,SAAS4H,GACjBiD,OAAAA,EAAUjD,IAASgD,EAAMhD,EAAK1H,SAQzC,IAAM6K,IAAUC,EACZ,OAAOF,EAGP9K,IAAAA,EAAQ7C,EAAE2K,QAAQgD,EAAI9K,MAAO6K,GAC7BI,EAAUjL,GAAM,IAAU,GAC1BiK,EAAWjK,GAAM,IAAS,GAE9B,GAAI+K,EAAQ,CACJ7C,IAAAA,EAAU/K,EAAE2K,QAAQmD,EAASL,GAC7BM,EAAOhD,GAAQ,IAAS,GACxBF,EAASE,GAAQ,IAAU,GAG3BiD,EAAWhO,EAAEmL,OAAO4C,GAAM,SAASC,EAAU1B,GAEtCtM,OAAAA,EAAEmL,OAAO6C,GAAU,SAASC,EAAMrG,GAErC,OAAOqG,EAAKlX,OAAOiJ,EAAEmE,IAAImI,EAAIzJ,OAAO,SAAS4H,GACzC,OAAO7C,EAAM7Q,OAAO0T,SAEzB,MACJ,CAAC,KAOJqD,EAAU,CAAC,IAAIhN,EAJJd,EAAEmE,IAAI6J,GAAU,SAASpG,GACzB,OAAA,IAAI5G,EAAI6J,EAAO9T,OAAO6Q,IAAQrB,eAMzCsH,IAEAf,EAAW,CAAC,IAAItL,EADE,IAAIR,EAAIhB,EAAEwG,OAAOsG,EAAU,mBAAmBvG,UAChClB,SAAU/B,EAAIgK,OAG3C,OAAA,IAAItM,EAAI8M,EAAQ/W,OAAO+V,IAAWvG,WAG7CjB,OAAQ,SAASvM,GACTmV,IAAAA,EAAWvX,KAAKqN,QAAQ,SAAUjL,GAASwN,UAC/C,KAAO2H,aAAoBlN,GACvB,OAAOkN,EAIX,IAAInD,EAAU/K,EAAE2K,QAAQuD,EAASrL,OAAO,SAAS4H,GACtCA,OAAAA,aAAgBlH,KAMvB4K,EAAWnO,EAAEmL,OAAOJ,GAAQ,IAAO,SAASY,EAAMlB,GAC3C,MAAA,CAAC9O,EAAGgQ,EAAKhQ,EAAI8O,EAAK9O,EAAG+H,EAAGiI,EAAKjI,EAAI+G,EAAK/G,KAC9C,CAAC/H,EAAG,EAAG+H,EAAG,IAQb,OALIyK,EADe,IAAfA,EAASzK,EACE,IAAI9B,EAAIuM,EAASxS,GAEjB,IAAI4H,EAAS4K,EAASxS,EAAGwS,EAASzK,GAG1C,IAAI1C,GAAK+J,GAAQ,IAAU,IAAIhU,OAAOoX,IAAW5H,WAG5DhB,QAAS,SAASxM,GACVqV,IAAAA,EAAczX,KAAKqN,QAAQ,UAAWjL,GAAS2R,YAC/C/G,EAASyK,EAAY,GAAGjD,OAAOpS,GAGnC,GAAsB,IAAlB4K,EAAOU,OACAf,OAAAA,EAAI+K,KAGXxD,IAAAA,EAASuD,EAAY,GAAG7H,UAI5B,KAAMsE,aAAkB7J,GACb,OAAA,IAAIA,EAAI2C,EAAQkH,GAAQtE,UAGnCsE,EAASA,EAAOhI,MAGZ+I,IAAAA,EAAQ,GAEZ5L,EAAEgJ,KAAK6B,GAAQ,SAASJ,GAChBA,aAAgBjJ,EAChBoK,EAAM/S,KAAK,CAAC4R,EAAK1H,KAAM0H,EAAKzH,MAE5B4I,EAAM/S,KAAK,CAAC4R,EAAMnH,EAAIoG,SAK1BqB,IAAAA,EAAU/K,EAAE2K,QAAQiB,GAAO,SAASE,GAC7BA,OAAAA,EAAK,GAAG1G,YAAY7C,WAI3B+L,EAAStO,EAAEgM,QAAQhM,EAAEmE,IAAI4G,GAAS,SAASa,GACvC7I,IAAAA,EAAO6I,EAAM,GAAG,GAEhB5I,EADM,IAAIlC,EAAId,EAAEiM,IAAIxR,MAAMuF,EAAG4L,GAAO,IAC1BrG,QAAQxM,GAElBiK,OAAAA,aAAeM,GAAsB,IAAfN,EAAIqB,OACnB,KAEA,CAACtB,EAAMC,OAclBuL,GATA3C,EAAQ5L,EAAE2K,QAAQ2D,GAAQ,SAASxC,GACnC,OAAIA,EAAK,aAAcvK,GAAQuK,EAAK,GAAG0C,UAC5B,OACA1C,EAAK,aAAc1K,EACnB,MAEA,WAGG3B,MAAQ,GACtBgP,EAAO7C,EAAM7L,KAAO,GACpB2O,EAAQ9C,EAAM3B,MAAQ,GAE1B,GAAIsE,EAAMpa,OAAS,EAAG,CAIdwa,IAAAA,EAAQ3O,EAAE2K,QAAQ4D,GAAO,SAASzC,GAC3BA,OAAAA,EAAK,GAAG7I,IAAImC,YAAY7C,WAGnCgM,EAAQ,GACRvO,EAAEgJ,KAAK2F,GAAO,SAAS/C,GACf3I,IAAAA,EAAM2I,EAAM,GAAG,GAAG3I,IAGlB2L,EAAQ,CAACC,IAAKvL,EAAI+K,KAAMS,IAAKxL,EAAI+K,MACrCrO,EAAEgJ,KAAK4C,GAAO,SAASE,GACnB8C,EAAM9C,EAAK,GAAGpV,MAAQoV,EAAK,MAG3B9K,EAAIC,eAAe2N,EAAMC,KAAKtJ,QAAQxM,GAASyM,OAAOoJ,EAAME,OAGxDF,EADAA,EAAME,IAAIhF,aACF,CAACiF,IAAKH,EAAMC,KAEZ,CAACG,IAAKJ,EAAME,MAO5B9O,EAAEgJ,KAAK4F,GAAO,SAAS5L,EAAKtM,GACxB6X,EAAM1V,KAAK,CAAC,IAAI0I,EAAK7K,EAAMuM,GAAMD,UAK7C,GAAIyL,EAAKta,OAAS,EAAG,CAIb8a,IAAAA,EAASjP,EAAE2K,QAAQ8D,GAAM,SAAS3C,GAC3BA,OAAAA,EAAK,GAAG/I,KAAKqC,YAAY7C,WAGpCkM,EAAO,GAEPzO,EAAEgJ,KAAKiG,GAAQ,SAASrD,GAKC,IAAjBA,EAAMzX,QACN6M,EAAIC,eAAe2K,EAAM,GAAG,IAAIrG,QAAQxM,GAASyM,OAAOoG,EAAM,GAAG,IAE7DA,EAAM,GAAG,GAAG9B,aACZ2E,EAAK5V,KAAK,CAAC,IAAIuI,EAAIwK,EAAM,GAAG,GAAG1L,MAAO0L,EAAM,GAAG,GAAG1L,OAAQ0L,EAAM,GAAG,KAEnE6C,EAAK5V,KAAK,CAAC,IAAIuI,EAAIwK,EAAM,GAAG,GAAG1L,MAAO0L,EAAM,GAAG,GAAG1L,OAAQ0L,EAAM,GAAG,KAGvE6C,EAAOA,EAAK1X,OAAO6U,MAO/BA,EAAQ2C,EAAMxX,OAAO0X,GAAM1X,OAAO2X,GAE9B3C,IAAAA,EAAY/L,EAAEmE,IAAIyH,GAAO,SAASE,GAClC,OAAO,IAAItK,EAAIsK,EAAK,GAAIA,EAAK,IAAIvG,QAAQxM,MAG7C,OAAO,IAAIiI,EAAI,CAAC2C,GAAQ5M,OAAOgV,IAAYxF,WAG/CS,WAAY,WACDhH,OAAAA,EAAE8G,IAAInQ,KAAKkM,OAAO,SAAS4H,GACvBA,OAAAA,aAAgBnH,GAAOmH,EAAKP,MAAMqD,aAMjD2B,SAAU,SAASlF,GACf,IACIY,EADcjU,KAAK+T,YACG,GAAG7H,MACzB3B,EAAO0J,EAAQzW,QAAU6L,EAAEoL,IAAIR,GAAS,SAAS/T,GACjD,OAAOA,EAAI8E,EAAI,KAGnB,GAAIuF,EAAM,CAEFrK,IAAAA,EAAM+T,EAAQ,GAAGN,SAErB,OADAzT,EAAIqT,MAAQU,EAAQ,GAAGV,MAChBvT,KAAKmF,QAAQ8O,EAAQ,GAAI/T,EAAImL,QAAQgI,IAI5C,OAAO,IAAIhJ,EAAI,CAACsC,EAAI6L,YAAYnF,IAAOjT,OAAOJ,KAAKkM,SAM3DuM,UAAW,WACHlB,IAAAA,GAAW,EACXrL,EAAQ7C,EAAEgM,QAAQhM,EAAEmE,IAAIxN,KAAKkM,OAAO,SAAS4H,EAAM9N,EAAG0S,GACtD,OAAKnB,GAAYzD,aAAgBnH,GAAOmH,EAAKP,MAAMoF,QAC/CpB,GAAW,GACQ,IAAZzD,EAAK9O,EAAW8O,EAAKH,SAAW,MAEhCG,MAIf,OAAqB,IAAjB5H,EAAM1O,OACC0O,EAAM,GAEN,IAAI7B,EAAI6B,IAIvBsI,OAAQ,SAASpS,GACNiH,OAAAA,EAAEmL,OAAOxU,KAAKkM,OAAO,SAAS8I,EAAMlB,GACvC,OAAOkB,EAAKgC,IAAIlD,EAAM1R,KACvBpC,KAAKmU,WAGZrB,QAAS,SAASnE,GACd,OAAO,IAAItE,EAAIhB,EAAEwG,OAAO7P,KAAKkM,MAAO,UAAWyC,IAASiB,WAG5DqD,MAAO,WACH,OAAOjT,MAGXoT,iBAAkB,WACV,OAAApT,KAAKkT,aACElT,KAGA,IAAIqK,EADChB,EAAEwG,OAAO7P,KAAK4O,UAAU1C,MAAO,qBACrB0D,WAI9BuD,WAAY,WACR,OAAO9J,EAAE8G,IAAI9G,EAAEwG,OAAO7P,KAAK4O,UAAU1C,MAAO,gBAGhD3B,KAAM,WACF,OAAOF,EAAIE,KAAKvK,OAGpB2T,OAAQ,WACJ,IAAIiF,EAAQ,SAAStF,GAAeA,OAAAA,aAAgB3G,GAChDtD,GAAAA,EAAE8G,IAAInQ,KAAKkM,MAAO0M,GAAQ,CACtB1Y,IAAAA,EAAMmJ,EAAEwP,KAAK7Y,KAAKkM,MAAO0M,GACtB,OAAA5Y,KAAKmF,QAAQjF,EAAKA,EAAIyT,UAE7B,OAAO,IAAItJ,EAAI,CAACsC,EAAIiH,KAAKxT,OAAOJ,KAAKkM,WAMjD7C,EAAEgJ,KAAK,CAAClI,EAAKE,IAAM,SAAStK,GACxBsJ,EAAE4D,OAAOlN,EAAM,CAEXqK,eAAgB,SAASmC,EAAMC,GACvBD,OAAAA,aAAgBxM,EACT,IAAIA,EAAKwM,EAAKL,MAAM9L,OAAOoM,IAE3B,IAAIzM,EAAKwM,EAAMC,SAMtCnD,EAAE4D,OAAO5C,EAAK,CAKVC,eAAgB,SAASgJ,EAAMD,GACvBC,GAAAA,aAAgB3G,GAAO2G,EAAKtO,EAAI,EAAG,CAEnC,IAAI8T,EAAUxF,EAAKK,SAGnB,OADAmF,EAAQvF,MAAQD,EAAKC,MACduF,EAAQzN,QAAQgI,GACpB,OAAIC,aAAgBjJ,EAIhBiJ,EAAKiF,SAASlF,GAGd,IAAIhJ,EAAIsC,EAAI6L,YAAYnF,GAAOC,IAK9C9I,aAAc,SAAS+B,EAAMC,GAGrBA,GAAAA,aAAiBnC,EAAK,CACtB,IAAI0O,EAAQ1O,EAAIG,aAAa+B,EAAMC,EAAMN,MAAM,IAC3CuJ,EAAO,IAAIpL,EAAIhB,EAAEoM,KAAKjJ,EAAMN,QAAQ0D,UACxC,OAAOvF,EAAIG,aAAauO,EAAOtD,GAGnC,IAAIuD,EAAQ,SAAS1F,GAAeA,OAAAA,aAAgBrI,GAKpD,GAAI+N,EAAMxM,IAAUD,aAAgBlC,GAAOhB,EAAE8G,IAAI5D,EAAKL,MAAO8M,GAAQ,CAG7DC,IAAAA,EAAW1M,EAAKL,MAAM5K,QAAQ4X,UAC9BhZ,EAAMmJ,EAAEwP,KAAKI,GARJ,SAAS3F,GAAeA,OAAAA,aAAgB1G,KAUrD,IAAKoM,EAAM9Y,GACA,OAAA,IAAImK,EAAIkC,EAAKL,MAAM9L,OAAO,CAAC,IAAIwM,EAAS,EAAGJ,EAAMxH,GAAGqG,QAAQ,eAGvE,IAAImM,EAAW,IAAI5K,EAAS1M,EAAI8E,EAAGwH,EAAMxH,GAUrC9E,OATJsX,EAASjE,MAAQrT,EAAIqT,MAIjBrT,IAAQ+Y,EAAS,KACjBzB,EAAWA,EAASnM,QAAQ,aAI5BnL,EAAI8E,EAAI,GAAKwH,EAAMxH,EAAI,GACvBwS,EAASzK,GAAKyK,EAASzK,EAChBR,EAAKpH,QAAQjF,EAAK,CAACyM,EAAIiH,IAAK4D,KAE5BjL,EAAKpH,QAAQjF,EAAKsX,GAI7BmB,IAAAA,EAAS,SAAS5C,EAAGC,GACjBA,GAAAA,aAAa/K,EAAK,CACd8K,GAAAA,aAAa9K,EACT8K,OAAAA,EAAE/Q,EAAI,GAAKgR,EAAEhR,EAAI,EAEV,CAAC2H,EAAIiH,IAAK,IAAIhH,EAASmJ,EAAE/Q,GAAIgR,EAAEhR,GAAGqG,QAAQ,aAK1C,CAAC,IAAIuB,EAASmJ,EAAE/Q,EAAGgR,EAAEhR,GAAGqG,QAAQ,aAKvC+K,IAAAA,EAAU,IAAIxJ,EAAS,EAAGoJ,EAAEtI,QAChC,OAAIsI,EAAEtI,OAAS,EACJ,CAACqI,EAAGK,EAAQ/K,QAAQ,WAEpB,CAAC0K,EAAGK,GAInB,IAAI9V,EAEJ,GAAI0V,aAAapL,GAAQoL,EAAE3J,IAAK,CAE5B,IAAIA,EAAM2J,EAAE3J,IACZ2J,EAAE3J,SAAMkI,EACRyB,EAAI,IAAInL,EAAImL,EAAG3J,GAaf0J,OANAzV,EAJA0V,aAAanL,EAIP,IAAIA,EAAImL,EAAE5J,KAAM/B,EAAIC,eAAe0L,EAAE3J,IAAK,WAG1C,IAAIxB,EAAImL,EAAGrJ,EAAIgK,KAGrBZ,aAAa9K,GAAe,IAAR8K,EAAE/Q,EAEf,CAAC1E,GAGD,CAACyV,EAAGzV,IAKnBiM,GAAAA,aAAgBlC,EAAK,CACrB,IAAI8O,EAAUR,EAAOtP,EAAE+P,KAAK7M,EAAKL,OAAQM,GACzC,OAAO,IAAInC,EAAIhB,EAAEgQ,QAAQ9M,EAAKL,OAAO9L,OAAO+Y,IAG5C,OAAO,IAAI9O,EADP8O,EAAUR,EAAOpM,EAAMC,IACHoD,WAgBhCrF,KAAM,SAAS+I,GACPA,GAAAA,aAAgBjJ,EAAK,CAErB,IAAIiP,EAAUjQ,EAAEwP,KAAKxP,EAAEgQ,QAAQ/F,EAAKpH,QAAQ,SAAS4H,GACjD,OAAQA,aAAgBlJ,GAAQkJ,aAAgBrJ,IAAQqJ,EAAKP,MAAMgG,QAEnE1T,EAAQwD,EAAEuL,QAAQtB,EAAKpH,MAAOoN,GAElC,GAAIA,EAAS,CACLF,IAKII,EALJJ,EAAO/P,EAAE+P,KAAK9F,EAAKpH,OACnBoN,KAAAA,EAAQ/F,MAAME,QAAU2F,EAAK7F,MAAME,QAC7B2F,EAAKlJ,IAAItF,IAASwO,EAAKlJ,IAAIzF,IAU7B5E,OALA2T,EADAF,aAAmB1O,EACNA,EAAKjJ,OAAO,CAAC2X,EAAQvZ,KAAMuZ,EAAQjN,KAAMhC,EAAID,eAAekP,EAAQhN,IAAK8M,GAAM7O,QAE/EE,EAAI9I,OAAO2X,EAAQlN,KAAM/B,EAAID,eAAekP,EAAQ/P,MAAO6P,GAAM7O,QAGpE,IAAV1E,EACO2T,EAEA,IAAInP,EAAIiJ,EAAKpH,MAAM5K,MAAM,EAAGuE,GAAOzF,OAAOoZ,IAAajP,OAZlE+O,EAAQ/F,MAAMgG,MAAO,EAiB7B,IACItF,EADcX,EAAKS,YACG,GAAG7H,MAEzBuN,EAAM,SAASvZ,GAAO,OAAOA,EAAI8E,EAAI,GACrC0U,EAAM,SAASxZ,GAAcA,OAAW,IAAXA,EAAI8E,GAAY9E,EAAIqT,MAAMI,QAG3D,GAAIM,EAAQzW,OAAS,GACjB6L,EAAEsQ,KAAK1F,EAASyF,IAChBrQ,EAAEsQ,KAAK1F,EAASwF,IAChBpQ,EAAEuQ,MAAM3F,GALG,SAAS/T,GAAcuZ,OAAAA,EAAIvZ,IAAQwZ,EAAIxZ,MAKtB,CAExB2Z,IAAAA,EAAWxQ,EAAEuL,QAAQtB,EAAKpH,MAAO7C,EAAEwP,KAAKvF,EAAKpH,MAAOwN,IACpDI,EAAWzQ,EAAEuL,QAAQtB,EAAKpH,MAAO7C,EAAEwP,KAAKvF,EAAKpH,MAAOuN,IAGpDI,GAAAA,EAAWC,EACX,OAAOxG,EAAKnO,QAAQ2U,EACAxG,EAAKpH,MAAM4N,GAAUnG,UAC7BoB,OAAO8E,IAM/B,OAAOvG,KAOfzI,EAAIhJ,UAAY,IAAImK,EAEpB3C,EAAE4D,OAAOpC,EAAIhJ,UAAW,CACpBqL,KAAMrC,EACNxJ,KAAM,WAAa,MAAO,CAACrB,KAAKoM,KAAMpM,KAAKqM,MAE3CqB,KAAM,SAASwE,EAAM9P,GACb2X,IAAAA,EAAa/Z,KAAKoM,KAAKsB,KAAKwE,EAAM9P,GAClC4X,EAAYha,KAAKqM,IAAIqB,KAAKwE,EAAM9P,GAWhC2X,GAAAA,EAAa,EAAG,CACZE,IAAAA,EAAgBja,KAAKqM,IAAI0C,WAGzBkL,GAAAA,aAAyB9O,EAAO,CAChC,IAAIjL,EAAM+Z,EAAcjV,EACpBkV,GAAYha,EAAMA,EAAI0S,WAAWtE,WAAW9Q,OAAS,EACrDsP,EAActG,KAAKlG,IAAI,GAAI4Z,GAE/BD,EADkB,IAAIrN,EAAS1M,EAAM4M,EAAaA,GACtBiC,WAE5BkL,GAAAA,aAAyBrN,EAEzB,GADqBpG,KAAKC,IAAIwT,EAAclN,GAAK,GAAM,EAInD,OAFmBvG,KAAKC,IAAIwT,EAAcjV,GAAK,GAAM,GACxB,EAAI,GACnBwB,KAAKlG,KAAK,EAAIyZ,EAAYC,GAIpD,OAAOxT,KAAKlG,IAAIyZ,EAAYC,IAGhChK,SAAU,WACC,OAAAhQ,KAAKoM,KAAK4D,WAAWxC,IAAI,SAASpP,GAC9B,MAAA,CACHA,KAAMA,EAAKA,KACXkC,IAAKlC,EAAKkC,IAAMN,KAAKqM,IAAIrH,IAE/BmV,KAAKna,QAGX2N,QAAS,WACL,MAAO,YAAc3N,KAAKoM,KAAKuB,UAC3B,KAAO3N,KAAKqM,IAAIsB,UAAY,KAGpC/B,MAAO,WACH,IAAIQ,EAAOpM,KAAKoM,KAAKR,QAIdQ,OAHHpM,KAAKoM,gBAAgBH,GAAOjM,KAAKoM,gBAAgBvB,KACjDuB,EAAO,IAAMA,EAAO,KAEjBA,EAAO,KAAOpM,KAAKqM,IAAIT,QAAU,KAG5CoC,IAAK,WACG,GAAAhO,KAAKsQ,WAGL,MAAO,aAAetQ,KAAKoa,WAAWpM,MAAQ,IAE3C,GAAIhO,KAAKuQ,SAOZ,OALmB,IAAfvQ,KAAKqM,IAAIrH,GACT/G,EAAM,oEAIS,IAAf+B,KAAKqM,IAAIU,EAEF,UAAY/M,KAAKoM,KAAK4B,MAAQ,IAG9B,UAAYhO,KAAKqM,IAAIU,EAAI,KAAO/M,KAAKoM,KAAK4B,MAAQ,IAG1D,GAAIhO,KAAKoM,gBAAgBxB,IAAS5K,KAAKoM,KAAK2K,aAC/C/W,KAAKqM,eAAeM,GAAO3M,KAAKqM,IAAIgO,YACpCra,KAAKqM,IAAIqB,QAAU,EAAG,CAGtB,IAAIjJ,EAAQzE,KAAKoM,KAAK4B,IAAI,CAACvJ,OAAO,IAClC,OAAOA,EAAM,GAAK,KAAOzE,KAAKqM,IAAI2B,MAAQ,IAAMvJ,EAAM,GAKtD,IAAI2H,EAAOpM,KAAKoM,KAAK4B,MASd5B,OARHpM,KAAKoM,gBAAgBH,GAAOjM,KAAKoM,gBAAgBvB,GAChD7K,KAAKoM,gBAAgBO,IAAQ3M,KAAKoM,KAAKiO,WAExCjO,EAAO,IAAMA,EAAO,KACbpM,KAAKoM,gBAAgBxB,GAAQ5K,KAAKoM,gBAAgB3B,KAEzD2B,EAAO,IAAMA,EAAO,KAEjBA,EAAO,KAAOpM,KAAKqM,IAAI2B,MAAQ,KAI9CwC,iBAAkB,WACP,OAAAxQ,KAAKuQ,UAAmBvQ,KAAKoM,KAAKoE,oBAG7C9B,OAAQ,WACJ,IAAIpO,EAAMN,KAAKqN,QAAQ,UAEvB,GAAI/M,EAAI8L,gBAAgB/B,EAOpB,OAAO,IAAIA,EAJChB,EAAEmE,IAAIlN,EAAI8L,KAAKF,OAAO,SAAS4H,GAChC,OAAA,IAAIjJ,EAAIiJ,EAAMxT,EAAI+L,SAGPqC,SAEnB,GAAIpO,EAAI8L,gBAAgBjC,GAAO7J,EAAI+L,eAAepB,GAAO3K,EAAI+L,IAAI5F,MAAMiH,OAAS,EAAG,CAatF,IATI4M,IAAAA,EAAWha,EAAI+L,IAAIqB,OAAS,EAC5B1I,EAAI1E,EAAI+L,IAAI5F,MAAMiH,OAElB6M,EAAS,SAASvD,GAClB,OAAOsD,EAAWtD,EAAM,IAAInM,EAAImM,EAAKrK,EAAIgK,MAIzC6D,EAAQ,CAAE,EAAGla,EAAI8L,MACZpG,EAAI,EAAGA,GAAKhB,EAAGgB,GAAK,EAAG,CAC5B,IAAIgR,EAAM,IAAI3M,EAAImQ,EAAMxU,EAAI,GAAIwU,EAAMxU,EAAI,IAC1CwU,EAAMxU,GAAKgR,EAAItI,SAASE,UAIxBvF,GAAAA,EAAE6G,IAAIsK,EAAOxV,GACb,OAAOuV,EAAOC,EAAMxV,IAIpByV,IAAAA,EAAUpR,EAAEmE,IAAIxI,EAAEsJ,SAAS,GAAG7J,MAAM,KAAK,SAAS/D,EAAKsF,EAAG0S,GAC1D,OAAOxN,OAAOxK,GAAO8F,KAAKlG,IAAI,EAAGoY,EAAKlb,OAASwI,EAAI,MAMhDuU,OAJPE,EAAUpR,EAAEqR,QAAQD,EAAS,GAItBF,EADHvD,EAAM,IAAI3M,EAAIhB,EAAEsR,KAAKH,EAAOC,IAAU/L,SAASE,WAGhD,OAAItO,EAAI+L,eAAelC,EAOnB,IAAIE,EAJChB,EAAEmE,IAAIlN,EAAI+L,IAAIH,OAAO,SAAS4H,GAC/B,OAAA,IAAIjJ,EAAIvK,EAAI8L,KAAM0H,GAAMpF,aAGbA,SAEfpO,GAIfqO,OAAQ,WACJ,IAAIrO,EAAMN,KAAKqN,QAAQ,UACvB,OAAI/M,EAAI8L,gBAAgB/B,EAUb,IAAIA,EATChB,EAAEmE,IAAIlN,EAAI8L,KAAKF,OAAO,SAAS4H,GACvC,OAAIA,aAAgB7I,GAAO3K,EAAI+L,IAAIwC,OAAOlC,EAAIgK,KAGnC,IAAI/J,EAAS,EAAGkH,EAAK9O,GAErB,IAAI6F,EAAIiJ,EAAMxT,EAAI+L,SAK1B/L,GAIfsO,QAAS,SAASxM,GAEd,GAAIpC,KAAKoM,gBAAgBvB,EAMd,OAAA,IAAIA,EAFA7K,KAAKoM,KAAKA,KACjBC,EAAMhC,EAAID,eAAepK,KAAKoM,KAAKC,IAAKrM,KAAKqM,MACvBuC,QAAQxM,GAGlC9B,IAAAA,EAAMN,KAAKqN,QAAQ,UAAWjL,GAE9BwY,EAAe,SAAS9G,GACxB,OAAOA,aAAgBrJ,GAAOqJ,EAAK1H,KAAKyC,OAAOvO,EAAI8L,OAGvD,GAAI9L,EAAI+L,eAAeM,GACA,IAAnBrM,EAAI+L,IAAIqB,OAGDf,OAAAA,EAAIoG,IAER,GAAIzS,EAAI+L,eAAeM,GACP,IAAnBrM,EAAI+L,IAAIqB,OAGDpN,OAAAA,EAAI8L,KAER,GAAIwO,EAAata,EAAI+L,KAGxB,OAAO/L,EAAI+L,IAAI9C,MAEZ,GAAIjJ,EAAI+L,eAAehC,GAC1BhB,EAAE8G,IAAI7P,EAAI+L,IAAIH,MAAO0O,GAAe,CAGpC,IAAIxR,EAAMC,EAAEwP,KAAKvY,EAAI+L,IAAIH,MAAO0O,GAGzB,OAAA,IAAI/P,EAFAzB,EAAIG,MACX8C,EAAM/L,EAAI+L,IAAI0I,OAAO3L,GAAKwG,WACJhB,QAAQxM,GAE/B,GAAI9B,EAAI8L,gBAAgBO,GAC3BrM,EAAI+L,eAAeM,EAAK,CAIxB,GAAIvK,GAAWA,EAAQyY,cAAe,CAUlC,IAAIxO,EAAM/L,EAAI+L,IAAIyO,aACdC,EAAiBza,EAAI8L,KAAK4O,mBAI1BC,GAHO,IAAIpQ,EAAIvK,EAAI8L,KAAM,IAAIQ,EAAS,EAAGP,EAAIU,IACvB6B,UAAUoM,mBAEfD,EAAgB,CAGjC,IAAIG,EAAU,IAAIrQ,EAAIvK,EAAI8L,KAAM,IAAInB,EAAIoB,EAAIrH,IAAI4J,UAChD,OAAO,IAAI/D,EAAIqQ,EAAS,IAAItO,EAAS,EAAGP,EAAIU,KAK7CzM,OAAAA,EAAI8L,KAAKgE,WAAW9P,EAAI+L,IAAKjK,GAEpC,OAAO9B,GAKfgQ,SAAU,WACN,IAAI6K,EAAQ,SAAS7O,GAAcA,OAAAA,aAAeK,GAAOL,EAAIiH,MAAMoF,QAC5DwC,OAAAA,EAAMnb,KAAKqM,MAASrM,KAAKqM,eAAehC,GAAOhB,EAAE8G,IAAInQ,KAAKqM,IAAIH,MAAOiP,IAIhFf,SAAU,WACN,GAAIpa,KAAKqM,eAAeM,EAAK,CACzB,IAAyB,IAArB3M,KAAKqM,IAAIqB,OACT,OAAO1N,KAAKoM,KAEZ,IAAI0M,EAAU9Y,KAAKqM,IAAIsH,SAGvB,OAFAmF,EAAQvF,MAAQlK,EAAEmK,MAAMxT,KAAKqM,IAAIkH,OACjCuF,EAAQvF,MAAMoF,QAAS,EAChB,IAAI9N,EAAI7K,KAAKoM,KAAM0M,GAE3B,GAAI9Y,KAAKqM,eAAehC,EACpB,OAAA,IAAIQ,EAAI7K,KAAKoM,KAAMpM,KAAKqM,IAAIoM,aAEnCxa,EAAM,0DAIdsS,OAAQ,WACG,OAAAvQ,KAAKqM,eAAeO,GAAY5M,KAAKqM,IAAIkH,MAAM6H,MAG1DC,cAAe,WACJ,OAAArb,KAAKoM,gBAAgBxB,IAAS5K,KAAKoM,KAAK2K,aAC3C/W,KAAKqM,eAAeM,GAA2B,IAApB3M,KAAKqM,IAAIqB,QAK5CsF,eAAgB,WACZ,GAAIhT,KAAKqM,eAAeM,IAA4B,IAArB3M,KAAKqM,IAAIqB,OACpC,OAAOrD,EAAID,eAAepK,KAAKoM,KAAMpM,KAAKoM,KAAK4G,kBAAkBpD,UAC9D,GAAI5P,KAAKqM,IAAI8G,aAAc,CAC9B,IAAI7S,EAAM,IAAIuK,EAAI7K,KAAKoM,KAAM/B,EAAIC,eAAetK,KAAKqM,KAAKuC,WAC1D,OAAOvE,EAAID,eAAe9J,EAAKA,EAAIsO,UAAUoE,kBAAkBpD,UAC5D,OAAI5P,KAAKoM,gBAAgBO,EACrB,IAAI9B,EAAI7K,KAAKoM,KAAK4G,iBAAkBhT,KAAKqM,KAAKuC,UAE9CjC,EAAIoG,KAInBD,QAAS,SAASnE,GACVvC,IAAAA,EAAMC,EAUV,GATIsC,aAAkB9D,GAClBuB,EAAOuC,EAAOvC,KACdC,EAAMsC,EAAOtC,MAEbD,EAAOuC,EACPtC,EAAMM,EAAIoG,KAIV/S,KAAKoM,KAAKyC,OAAOzC,GAAO,CACxB,GAAIpM,KAAKqM,IAAIwC,OAAOxC,GAGhB,OAAOrM,KACJ,GAAIA,KAAKqM,eAAeM,GAAON,aAAeM,EAGjD,OAAO,IAAI9B,EAAI7K,KAAKoM,KAAMO,EAAI2F,IAAItS,KAAKqM,IAAKA,IAAMuC,UAC/C,GAAI5O,KAAKqM,eAAeM,GAAON,aAAeM,EAG1CA,OAAAA,EAAIoG,IAGXuI,IAAAA,EAAOtb,KAAKqM,IAAI4G,QAAQc,YACxBwH,EAAOlP,EAAI4G,QAAQc,YAEvB,GAAIuH,EAAK,GAAGzM,OAAO0M,EAAK,IAKb,OAAA,IAAI1Q,EAAIuB,EADL,IAAI/B,EADIsC,EAAI2F,IAAIgJ,EAAK,GAAG9G,SAAU+G,EAAK,GAAG/G,UACrB8G,EAAK,GAAG1L,WAAWA,WACxBhB,UAI3BjC,OAAAA,EAAIoG,KAGfG,WAAY,WACR,GAAIlT,KAAKoM,KAAK8G,aACV,OAAO,EAGX,IAAI7G,EAAMrM,KAAKqM,IAAI0C,WACZ1C,OAAAA,aAAepB,GAAOoB,EAAIqB,OAAS,GAAM,GAGpD0F,iBAAkB,WACV,GAAApT,KAAKkT,aACL,OAAOlT,KAEP,IAAIqM,EAAMrM,KAAKqM,IAAI0C,WACf1C,GAAAA,aAAepB,EAAK,CACpB,IAAIjG,EAAIqH,EAAIqB,OACR1I,GAAAA,EAAI,EAEJ,OAAO,IAAI6F,EAAI7K,KAAKoM,KAAM,IAAInB,EAAIjG,EAAE,IACjC,GAAIA,GAAK,EAEZ,OAAO,IAAI6F,EAAI7K,KAAKoM,KAAM,IAAInB,EAAIjG,EAAE,IAGrC2H,OAAAA,EAAIoG,OAKvB1J,EAAE4D,OAAOpC,EAAK,CACVb,KAAM,SAASsC,GACJ,OAAA,IAAIzB,EAAIyB,EAAKK,EAAI6O,OAG5BlQ,QAAS,SAASmQ,EAAUC,GAKjB,OAAA,IAAI7Q,EAAI4Q,EAJLpR,EAAIE,KAAKF,EAAIG,aAAa,IAAIS,EAAI,GAAIyQ,IAInBrQ,QAAQ,YAO7CZ,EAAI5I,UAAY,IAAImK,EAEpB3C,EAAE4D,OAAOxC,EAAI5I,UAAW,CACpBqL,KAAMzC,EACNpJ,KAAM,WAAa,MAAO,CAACrB,KAAKoM,KAAMpM,KAAKuJ,QAE3CmE,KAAM,SAASwE,EAAM9P,GACVoE,OAAAA,KAAK4C,IAAIpJ,KAAKuJ,MAAMmE,KAAKwE,EAAM9P,IAAYoE,KAAK4C,IAAIpJ,KAAKoM,KAAKsB,KAAKwE,EAAM9P,KAGpFuL,QAAS,WACL,MAAO,aAAe3N,KAAKuJ,MAAMoE,UAC7B,gBAAkB3N,KAAKoM,KAAKuB,UAAY,MAGhD/B,MAAO,WACCrC,IAAAA,EAAQ,IAAMvJ,KAAKuJ,MAAMqC,QAAU,IACnC,OAAA5L,KAAK2b,YACE,KAAOpS,EAEP,QAAUvJ,KAAKoM,KAAKR,QAAU,KAAOrC,GAIpDyE,IAAK,WACGzE,IAAAA,EAAQ,IAAMvJ,KAAKuJ,MAAMyE,MAAQ,IACjC,OAAAhO,KAAK2b,YACE,OAASpS,EAET,UAAYvJ,KAAKoM,KAAK4B,MAAQ,IAAMzE,GAInDqF,QAAS,SAASxM,GACVgH,IAAAA,EAAMpJ,KAAKqN,QAAQ,UAAWjL,GAElC,OAAIgH,EAAIG,iBAAiBoD,GAA4B,IAArBvD,EAAIG,MAAMmE,OAG/Bf,EAAI+K,KAEJtO,EAAIgD,KAAKyC,OAAOzF,EAAIG,OAGpBoD,EAAIoG,IAEJ3J,EAAIG,iBAAiBsB,GAC5BzB,EAAIG,MAAM6C,KAAKyC,OAAOzF,EAAIgD,MAGnBhD,EAAIG,MAAM8C,IAEVjD,GAIfsF,OAAQ,WACJ,IAAItF,EAAMpJ,KAAKqN,QAAQ,UAEvB,OAAIjE,EAAIG,iBAAiBc,EAQd,IAAIF,EALCd,EAAEmE,IAAIpE,EAAIG,MAAM2C,OAAO,SAAS4H,GAEjC,OAAA,IAAIrJ,EAAIrB,EAAIgD,KAAM0H,GAAMpF,aAK5BtF,EAAIG,iBAAiBsB,EAGrB,IAAIR,EAAIjB,EAAIG,MAAM8C,IAAK,IAAI5B,EAAIrB,EAAIgD,KAAMhD,EAAIG,MAAM6C,MAAMsC,UAAUkB,UAClExG,EAAIuS,YAKLvS,EAFAiB,EAAIG,aAAa,IAAIC,EAAIM,EAAMgD,EAAG3E,EAAIG,OAAQ,IAAIkB,EAAIM,EAAMgD,EAAG3E,EAAIgD,QAMlFmH,MAAOlK,EAAE4D,OAAOxC,EAAI5I,UAAU0R,MAAO,CACjCgG,MAAM,IAGVrG,WAAY,WACR,IAAI9J,EAAMpJ,KAAK4O,UAEXxF,OAAAA,EAAIgD,gBAAgBO,GACpBvD,EAAIG,iBAAiBoD,GACd3M,KAAK0N,OAAS,GAM7B8C,iBAAkB,WAAa,OAAO,GAEtCmL,UAAW,WAAoB,OAAA3b,KAAKoM,KAAKyC,OAAO9D,EAAMgD,MAG1D1E,EAAE4D,OAAOxC,EAAK,CACVC,QAAS,WAAoBK,OAAAA,EAAMgD,GACnCpD,OAAQ,WAAoBgC,OAAAA,EAAIiP,KAEhCja,OAAQ,SAASyK,EAAM7C,GACfH,IAAAA,EAAM,IAAIqB,EAAI2B,EAAM7C,GAIxB,OAHKA,EAAMgK,MAAME,SACbrK,EAAMA,EAAIiC,QAAQ,SAEfjC,KAOfwB,EAAK/I,UAAY,IAAImK,EAErB3C,EAAE4D,OAAOrC,EAAK/I,UAAW,CACrBqL,KAAMtC,EACNvJ,KAAM,WAAa,MAAO,CAACrB,KAAKD,KAAMC,KAAKsM,MAE3CuP,UAAW,CACP3D,IAAK,CACDxK,KAAMlH,KAAK0R,IACXvK,QAAS,aACTK,IAAK,QACLU,OAAQ,WAAa,OAAO1O,OAEhCmY,IAAK,CACDzK,KAAMlH,KAAK2R,IACXxK,QAAS,aACTK,IAAK,QACLU,OAAQ,WAAa,OAAO1O,OAEhCoY,IAAK,CACD1K,KAAMlH,KAAK4R,IACXzK,QAAS,aACTK,IAAK,QACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAaI,EAAKsN,IAAIlY,KAAKsM,KAAM1B,EAAKuN,IAAInY,KAAKsM,QAGlEwP,IAAK,CACDpO,KAAM,SAASpB,GAAO,OAAO,EAAI9F,KAAK0R,IAAI5L,IAC1CqB,QAAS,eACTK,IAAK,QACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAamC,EAAIoG,IAAKnI,EAAKsN,IAAIlY,KAAKsM,QAGvDyP,IAAK,CACDrO,KAAM,SAASpB,GAAO,OAAO,EAAI9F,KAAK2R,IAAI7L,IAC1CqB,QAAS,eACTK,IAAK,QACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAamC,EAAIoG,IAAKnI,EAAKuN,IAAInY,KAAKsM,QAGvD+L,IAAK,CACD3K,KAAM,SAASpB,GAAO,OAAO,EAAI9F,KAAK4R,IAAI9L,IAC1CqB,QAAS,eACTK,IAAK,QACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAaI,EAAKuN,IAAInY,KAAKsM,KAAM1B,EAAKsN,IAAIlY,KAAKsM,QAGlE0P,OAAQ,CACJtO,KAAMlH,KAAKyV,KACXtO,QAAS,cACTK,IAAK,YAETkO,OAAQ,CACJxO,KAAMlH,KAAK2V,KACXxO,QAAS,cACTK,IAAK,YAEToO,OAAQ,CACJ1O,KAAMlH,KAAK6V,KACX1O,QAAS,cACTK,IAAK,YAETsO,OAAQ,CACJ5O,KAAM,SAASpB,GAAO,OAAO9F,KAAKyV,KAAK,EAAI3P,IAC3CqB,QAAS,gBACTK,IAAK,0BAETuO,OAAQ,CACJ7O,KAAM,SAASpB,GAAO,OAAO9F,KAAK2V,KAAK,EAAI7P,IAC3CqB,QAAS,gBACTK,IAAK,0BAETwO,OAAQ,CACJ9O,KAAM,SAASpB,GAAO,OAAO9F,KAAK6V,KAAK,EAAI/P,IAC3CqB,QAAS,gBACTK,IAAK,0BAETyO,KAAM,CACF/O,KAAM,SAASpB,GACX,OAAQ9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,IAAQ,GAE9CqB,QAAS,SAAS+O,GACd,MAAO,cAAgBA,EAAS,kBAAoBA,EAAS,YAEjE1O,IAAK,SACLU,OAAQ,WAAa,OAAO1O,OAEhC2c,KAAM,CACFjP,KAAM,SAASpB,GACX,OAAQ9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,IAAQ,GAE9CqB,QAAS,SAAS+O,GACd,MAAO,cAAgBA,EAAS,kBAAoBA,EAAS,YAEjE1O,IAAK,SACLU,OAAQ,WAAa,OAAO1O,OAEhC4c,KAAM,CACFlP,KAAM,SAASpB,GACX,OAAQ9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,KAAS9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,KAEzEqB,QAAS,SAAS+O,GACP,MAAA,cACYA,EAAS,kBAAoBA,EADzC,mBAGYA,EAAS,kBAAoBA,EAHzC,QAMX1O,IAAK,SACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAaI,EAAK6R,KAAKzc,KAAKsM,KAAM1B,EAAK+R,KAAK3c,KAAKsM,QAGpEuQ,KAAM,CACFnP,KAAM,SAASpB,GAAO,OAAO,GAAK9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,KAC5DqB,QAAS,SAAS+O,GACd,MAAO,kBAAoBA,EAAS,kBAAoBA,EAAS,QAErE1O,IAAK,SACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAamC,EAAIoG,IAAKnI,EAAK6R,KAAKzc,KAAKsM,QAGxDwQ,KAAM,CACFpP,KAAM,SAASpB,GAAO,OAAO,GAAK9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,KAC5DqB,QAAS,SAAS+O,GACd,MAAO,kBAAoBA,EAAS,kBAAoBA,EAAS,QAErE1O,IAAK,SACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAamC,EAAIoG,IAAKnI,EAAK+R,KAAK3c,KAAKsM,QAGxDyQ,KAAM,CACFrP,KAAM,SAASpB,GACX,OAAQ9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,KAAS9F,KAAK6F,IAAIC,GAAO9F,KAAK6F,KAAKC,KAEzEqB,QAAS,SAAS+O,GACP,MAAA,cACYA,EAAS,kBAAoBA,EADzC,mBAGYA,EAAS,kBAAoBA,EAHzC,QAMX1O,IAAK,SACLU,OAAQ,WACJ,OAAOrE,EAAIG,aAAaI,EAAK+R,KAAK3c,KAAKsM,KAAM1B,EAAK6R,KAAKzc,KAAKsM,SAKxE0Q,OAAQ,WACJ,OAAO3T,EAAE4T,SAAS,CAAC,MAAO,OAAQjd,KAAKD,OAG3CgX,UAAW,WACP,OAAoC,IAA7B/W,KAAKD,KAAK6U,QAAQ,QAG7BiD,QAAS,WACL,OAAOxO,EAAE4T,SAAS,CAAC,MAAO,OAAQjd,KAAKD,OAG3C2N,KAAM,SAASwE,EAAM9P,GAGV8K,OAAAA,EAFIlN,KAAK6b,UAAU7b,KAAKD,MAAM2N,MAC3B1N,KAAKsM,IAAIoB,KAAKwE,EAAM9P,KAIlCuL,QAAS,WACDT,IAAAA,EAAOlN,KAAK6b,UAAU7b,KAAKD,MAAM4N,QACrC,GAAoB,mBAATT,EACP,OAAOA,EAAKlN,KAAKsM,IAAIqB,WAClB,GAAoB,iBAATT,EACPA,OAAAA,EAAOlN,KAAKsM,IAAIqB,UAAY,KAEnC,MAAM,IAAI9M,MAAM,+BAAiCb,KAAKD,OAI9D6L,MAAO,WACI,OAAA5L,KAAKD,KAAO,IAAMC,KAAKsM,IAAIV,QAAU,KAGhDoC,IAAK,SAAS5L,GACN8K,IAAAA,EAAOlN,KAAK6b,UAAU7b,KAAKD,MAAMiO,IACjC1B,EAAM,IAAMtM,KAAKsM,IAAI0B,MAAQ,IACjC,OAAQ5L,GAAWA,EAAQqC,MAAS,CAACyI,EAAMZ,GAAOY,EAAOZ,GAG7DiH,MAAOlK,EAAE4D,OAAOrC,EAAK/I,UAAU0R,MAAO,CAClCgG,MAAM,IAGVrG,WAAY,WAGR,OAFWlT,KAAK4O,UAEPtC,eAAeK,GACb3M,KAAK0N,OAAS,GAM7BtC,cAAe,WACP,GAAApL,KAAKqM,IAAK,CACN/L,IAAAA,EAAM,IAAIuK,EAAI7K,KAAMA,KAAKqM,KAE7B,OADKA,KAAAA,SAAMkI,EACJjU,EAEP,OAAON,MAKfwQ,iBAAkB,WAAa,OAAO,GAEtC9B,OAAQ,WACJ,IAAI5F,EAAO9I,KAAKqN,QAAQ,UACxB,GAAKvE,EAAKiO,YAKN,OAAOjO,EAHH4F,IAAAA,EAAS5F,EAAK+S,UAAU/S,EAAK/I,MAAM2O,OACvC,OAAOrF,EAAE8Q,KAAKzL,EAAQ5F,EAAfO,IAMfuF,QAAS,SAASxM,GACV0G,IAEIwD,EAFJxD,EAAO9I,KAAKqN,QAAQ,UAAWjL,GACnC,OAAK0G,EAAKiO,aAAejO,EAAKwD,IAAI6G,cAG1B7G,EADAxD,EAAKwD,eAAeK,EACd7D,EAAKwD,IAAI7F,MAET4D,EAAIG,aAAa1B,EAAKwD,IAAKK,EAAIiH,KAAKhF,QAAQxM,GAGlD0G,EAAKkU,SAEE,IAAIpS,EAAK9B,EAAK/I,KAAMuM,GAIpB,IAAIjC,EAAIsC,EAAIiH,IAAK,IAAIhJ,EAAK9B,EAAK/I,KAAMuM,KAGzCxD,KAKnBO,EAAE4D,OAAOrC,EAAM,CACXjJ,OAAQ,SAASwT,EAAM7I,GACnB,IAAIvM,EAAOoV,EAAK,GACZ9I,EAAM8I,EAAK,GAEX9I,GAAOA,EAAIwC,OAAOlC,EAAIiH,OAEtB7T,EAAO,MAAQA,EACfsM,OAAMkI,GAGNzL,IAAAA,EAAO,IAAI8B,EAAK7K,EAAMuM,GAS1B,OARKA,EAAIiH,MAAME,SACX3K,EAAOA,EAAKuC,QAAQ,SAGpBgB,IACAvD,EAAKuD,IAAMA,GAGRvD,GAGXoP,IAAK,SAAS5L,GACV,OAAO,IAAI1B,EAAK,MAAO0B,IAG3B6L,IAAK,SAAS7L,GACV,OAAO,IAAI1B,EAAK,MAAO0B,IAG3BmQ,KAAM,SAASnQ,GACX,OAAO,IAAI1B,EAAK,OAAQ0B,IAG5BqQ,KAAM,SAASrQ,GACX,OAAO,IAAI1B,EAAK,OAAQ0B,MAMhCf,EAAI1J,UAAY,IAAImK,EAEpB3C,EAAE4D,OAAO1B,EAAI1J,UAAW,CACpBqL,KAAM3B,EACNlK,KAAM,WAAoB,MAAA,CAACrB,KAAKsM,MAChCoB,KAAM,SAASwE,EAAM9P,GAAW,OAAOoE,KAAKC,IAAIzG,KAAKsM,IAAIoB,KAAKwE,EAAM9P,KACpEuL,QAAS,WAAa,MAAO,YAAc3N,KAAKsM,IAAIqB,UAAY,KAChE/B,MAAO,WAAa,MAAO,OAAS5L,KAAKsM,IAAIV,QAAU,KAEvDoC,IAAK,WACD,MAAO,UAAYhO,KAAKsM,IAAI0B,MAAQ,YAGxCY,QAAS,SAASxM,GACVqE,IAAAA,EAAMzG,KAAKqN,QAAQ,UAAWjL,GAElC,GAAIqE,EAAI6F,IAAI4G,aAEDzM,OAAAA,EAAI6F,IACR,GAAI7F,EAAI6F,eAAeK,EAE1B,OAAOlG,EAAI6F,IAAI7F,MACZ,GAAIA,EAAI6F,eAAejC,EAAK,CAE/B,IAAI6B,EAAQ7C,EAAE2K,QAAQvN,EAAI6F,IAAIJ,OAAO,SAAS4H,GAC1C,OAAIA,EAAKZ,aACE,WACAY,aAAgBnH,EAChB,SAEA,WAIXuQ,EAAYhR,EAAMoO,SAASla,OAAOiJ,EAAEwG,OAAO3D,EAAMc,OAAQ,QAM7D,OAJId,EAAM4C,MAAMtR,QACZ0f,EAAUhb,KAAK,IAAIqJ,EAAI,IAAIlB,EAAI6B,EAAM4C,OAAOc,YAGzC,IAAIvF,EAAI6S,GAAWtN,UAE1B,OAAOnJ,GAKfiI,OAAQ,WACJ,IAAIjI,EAAMzG,KAAKqN,QAAQ,UAEvB,OAAI5G,EAAI6F,eAAejC,EAKZ,IAAIA,EAHChB,EAAEmE,IAAI/G,EAAI6F,IAAIJ,OAAO,SAAS4H,GACtC,OAAO,IAAIvI,EAAIuI,OAIZrN,GAIfyM,WAAY,WAAa,OAAO,KAUpChJ,EAAGrI,UAAY,IAAImK,EAEnB3C,EAAE4D,OAAO/C,EAAGrI,UAAW,CACnBqL,KAAMhD,EACN7I,KAAM,WAAoB,MAAA,CAACrB,KAAKuM,KAAMvM,KAAKD,KAAMC,KAAKwM,QAEtDgE,iBAAkB,WAAa,OAAO,GAEtC5E,MAAO,WACH,OAAO5L,KAAKuM,KAAKX,QAAU5L,KAAKD,KAAOC,KAAKwM,MAAMZ,SAGtDuR,MAAO,CACH,IAAK,MACL,IAAK,MACL,IAAK,MACL,KAAM,SACN,KAAM,SACA,KAAA,UAGVnP,IAAK,WACD,OAAOhO,KAAKuM,KAAKyB,MAAQhO,KAAKmd,MAAMnd,KAAKD,MAAQC,KAAKwM,MAAMwB,OAGhES,UAAW,WACP,IAAI2O,EAAKpd,KAAKqN,QAAQ,aAEtB,OAAIhE,EAAE4T,SAAS,CAAC,IAAK,MAAOG,EAAGrd,MAEpB,IAAImK,EAAGkT,EAAG5Q,MAAO4Q,EAAGrd,KAAKoF,QAAQ,IAAK,KAAMiY,EAAG7Q,MAE/C6Q,GAQf1J,OAAQ,SAAS2J,GACb,IAAIC,EAAS,SAAShK,GAClB,OAAOA,aAAgB3G,GAAO2G,EAAK+G,YAA8B,IAAhB/G,EAAK5F,QAItDxB,EAAQ,GAERlM,KAAKuM,gBAAgBpC,EACrB+B,EAAQ7C,EAAEmK,MAAMxT,KAAKuM,KAAKL,OAClBoR,EAAOtd,KAAKuM,QACpBL,EAAQ,CAAClM,KAAKuM,OAGdvM,KAAKwM,iBAAiBrC,EACtB+B,EAAQA,EAAM9L,OAAOJ,KAAKwM,MAAMmH,SAASzH,OACjCoR,EAAOtd,KAAKwM,QACpBN,EAAMhK,KAAKlC,KAAKwM,MAAMmH,UAG1B,IAAI4J,GAAgBvd,KAAKwd,aAOzBtR,EAAQ7C,EAAEwG,OAAO3D,EAAO,UAAW,CAAC2O,eAAe,IAGnD,IAAK,IAAI7U,EAAI,EAAGA,EAAIkG,EAAM1O,OAAQwI,IAAK,CAC/B8G,IAAAA,EAAcZ,EAAMlG,GAAGgN,iBAGvBuK,IAAiBzQ,EAAYoG,eAC7BpG,EAAcA,EAAYsG,oBAGzBtG,EAAY+B,OAAOlC,EAAIoG,OACxB7G,EAAQ7C,EAAEmE,IAAItB,GAAO,SAAS4H,GACnBzJ,OAAAA,EAAID,eAAe0J,EAAMhH,GAAaiC,SAAS,CAClDC,MAAM,EACN6L,eAAe,QAM3BlF,IAAAA,EAAM,IAAIxL,EAAI+B,GAAO0D,UAClByN,OAAAA,EAAa1H,EAAM3V,KAAKyd,cAAc9H,IAOjD8H,cAAe,SAASnK,GACpB,IAAIiK,GAAgBvd,KAAKwd,aAErBnO,EAAaiE,EAAKvE,SAAS,CAACC,MAAM,IAClCuI,EAAWlI,EAAWV,OAAO,CAAC4G,aAAcgI,IAEhD,KAAMhG,aAAoBlN,GACtB,OAAOiJ,EAGX,IAAIpH,EAAQqL,EAASrL,MAMjBkI,EAAU/K,EAAE2K,QAAQ9H,GAJZ,SAAS4H,GAAeA,OAAAA,aAAgB3J,KAKhDiN,EAAOhD,GAAQ,IAAS,GACxBF,EAASE,GAAQ,IAAU,GAE/B,GAAIgD,EAAK5Z,QAAUwC,KAAKwd,aAGpB,OAAO,IAAInT,EAAI+M,GAAMxH,UAGrB9C,IAAAA,EAAcoH,EAEbkD,EAAK5Z,SAGNsP,EAAczD,EAAExE,OAAOiI,GAlBd,SAASgH,GAAQ,QAASA,EAAKrE,UAAUjS,WAqBlD+f,IAGAzQ,EAAczD,EAAEwG,OAAO/C,EAAa,qBAIxCA,EAAczD,EAAExE,OAAOiI,GA3BX,SAASgH,GAAQ,OAAOA,EAAKjF,OAAOlC,EAAIoG,QA6BpDjG,EAAczD,EAAEmE,IAAIV,GAAa,SAASgH,GAC/B,OAAA,IAAIjJ,EAAIiJ,EAAMnH,EAAIgK,QAG7B,IAAI+G,EAAgB,IAAIrT,EAAI6B,EAAM9L,OAAO0M,IAAc8B,UAIvD,OAAI8O,EAAc7O,OAAO0I,GACdlI,EAEAqO,GAIfF,WAAY,WACR,OAAOnU,EAAE4T,SAAS,CAAC,IAAK,MAAOjd,KAAKD,OAGxCqR,QAAS,SAAStC,GAEd,KAAMA,aAAiB5E,GACnB,OAAO,EAGX,IAAIyT,EAAM3d,KAAKyO,YACXmP,EAAM9O,EAAML,YAEhB,GAAIkP,EAAI5d,OAAS6d,EAAI7d,KACjB,OAAO,EAKP8R,IAAAA,EAAQ8L,EAAIF,cAAcE,EAAIjK,QAAJ,GAAkC9E,WAC5DkD,EAAQ8L,EAAIH,cAAcG,EAAIlK,QAAJ,GAAkC9E,WAEhE,OAAI+O,EAAIH,aAEG3L,EAAMT,QAAQU,IACdD,EAAMT,QAAQ/G,EAAIC,eAAewH,IAEjCD,EAAMT,QAAQU,IAK7Be,SAAU,SAAS/D,GACf,IAAI6O,EAAM3d,KAAKyO,YACXmP,EAAM9O,EAAML,YAEZmC,EAAO+M,EAAIpR,KAAKsG,SAAS+K,EAAIrR,OAASoR,EAAInR,MAAMqG,SAAS+K,EAAIpR,OAEjE,OAAImR,EAAIH,aAEG5M,GAAS+M,EAAIpR,KAAKsG,SAAS+K,EAAIpR,QAAUmR,EAAInR,MAAMqG,SAAS+K,EAAIrR,MAEhEqE,GAMftB,aAAc,WACNgE,IAAAA,EAAOtT,KAAK0T,QAAwB,GACpCrE,EAAarP,KAAKyd,cAAcnK,GAAMvE,WAC1C,OAAOuE,EAAKzE,OAAOQ,IACZrP,KAAKuM,KAAK+C,gBACVtP,KAAKwM,MAAM8C,kBAI1BjG,EAAE4D,OAAO/C,EAAGrI,UAAW,CAEnBgc,+BAAgC,SAASpU,GACrC,IAAI6J,EAAOtT,KAAK0T,SAChB,IAAKJ,EAAKrD,GAAG9F,IAA8B,IAAtBmJ,EAAKpH,MAAM1O,OAC5B,MAAM,IAAIqD,MAAM,6DAIpB,IAIIkV,EAAGC,EAJelC,EAcfzJ,OAdeyJ,EAMXR,EAAKpH,MAAM,IALNgE,IAAIpF,IAAQzB,EAAE4T,SAASnJ,EAAKrE,UAAWhG,EAASjH,SAM5DuT,EAAI1L,EAAIC,eAAegJ,EAAKpH,MAAM,IAClC8J,EAAI3L,EAAIG,aAAa8I,EAAKpH,MAAM,GAAIzC,KAEpCsM,EAAI1L,EAAIC,eAAegJ,EAAKpH,MAAM,IAClC8J,EAAI3L,EAAIG,aAAa8I,EAAKpH,MAAM,GAAIzC,IAGjCY,EAAIG,aAAauL,EAAGC,GAAGjH,cAOtCtC,EAAO5K,UAAY,IAAImK,EAEvB3C,EAAE4D,OAAOR,EAAO5K,UAAW,CAEvB2O,iBAAkB,WAAa,OAAO,GAEtCsC,QAAS,SAASnE,GACd,OAAIA,aAAkBlC,GAAUkC,aAAkBhC,EACvC3M,KAAK6O,OAAOF,GAAU3O,KAAO2M,EAAIoG,IAEjCpE,EAAOmE,QAAQ9S,SAUlCwL,EAAK3J,UAAY,IAAI4K,EAErBpD,EAAE4D,OAAOzB,EAAK3J,UAAW,CACrBqL,KAAM1B,EACNnK,KAAM,WAAa,MAAO,CAACrB,KAAKwC,OAAQxC,KAAKsM,MAE7CV,MAAO,WACI,OAAA5L,KAAKwC,OAAS,IAAMxC,KAAKsM,IAAIV,QAAU,KAGlDoC,IAAK,WACM,OAAAhO,KAAKwC,OAAS,IAAMxC,KAAKsM,IAAI0B,MAAQ,KAGhDN,KAAM,SAASwE,EAAM9P,GACbkK,IAAAA,EAAMtM,KAAKsM,IACXY,EAAOgF,EAAKlS,KAAKwC,QACjBsb,EAAUzU,EAAE4D,OAAO5D,EAAEmK,MAAMtB,GAAO,CAClC6L,EAAGzR,EAAIoB,KAAKwE,EAAM9P,KAElB4b,EAAald,EAAMoM,EAAM9K,GACzB4b,OAAAA,EAAWC,OACJD,EAAW1K,KAAK5F,KAAKoQ,EAAS1b,GAGlC4b,GAGXrQ,QAAS,WACL,MAAO,SAAW3N,KAAKwC,OAAS,MAC5BxC,KAAKsM,IAAIqB,UAAY,KAG7BqC,SAAU,WACN,OAAOhQ,KAAKsM,IAAI0D,YAGpBP,QAAS,SAASC,GACd,OAAIA,EACO1P,KAAKsM,IAAImD,UAETpG,EAAEiI,MAAMtR,KAAKsM,IAAImD,UAAW,CAACzP,KAAKwC,SAASsN,QAI1DC,UAAW,WACP,OAAO/P,KAAKsM,IAAIyD,eAUxBjF,EAAIjJ,UAAY,IAAI4K,EAEpBpD,EAAE4D,OAAOnC,EAAIjJ,UAAW,CACpBqL,KAAMpC,EACNzJ,KAAM,WAAa,MAAO,CAACrB,KAAKwC,OAAQxC,KAAK0M,YAE7C6C,SAAU,WAAa,MAAO,IAC9BlC,QAAS,WAAa,OAAOrN,MAE7B4L,MAAO,WACCsS,IAAAA,EAAM,GAIH,OAHHle,KAAK0M,YACLwR,EAAM,KAAOle,KAAK0M,UAAUd,QAAU,KAEnC5L,KAAKwC,OAAS0b,GAKzBC,YAAa,WACLD,IAAAA,EAAMle,KAAK0M,UACXwR,OAAAA,IAAQA,aAAevR,GAAOuR,aAAezR,GACtCzM,KAAKwC,OAAS,IAAM0b,EAAItS,QAExB5L,KAAK4L,SAIpBoC,IAAK,WACGkQ,IAAAA,EAAM,GAKV,OAJIle,KAAK0M,YACLwR,EAAM,KAAOle,KAAK0M,UAAUsB,MAAQ,MAE3BhO,KAAKwC,OAAOhF,OAAS,EAAI,KAAO,IAC7BwC,KAAKwC,OAAS0b,GAGlC3P,KAAM,WAAa,MAAO,OAASvO,KAAK4L,QAAU,KAElD8B,KAAM,SAASwE,EAAM9P,GACjB,OAAO8P,EAAKlS,KAAKme,gBAGrBxQ,QAAS,WACL,MAAO,SAAW3N,KAAKme,cAAgB,MAG3C1O,QAAS,WAAa,MAAO,CAACzP,KAAKme,gBAEnCjL,WAAY,WAAa,OAAO,KAMpCnI,EAAMlJ,UAAY,IAAI4K,EAEtBpD,EAAE4D,OAAOlC,EAAMlJ,UAAW,CACtBqL,KAAMnC,EACN1J,KAAM,WAAoB,MAAA,CAACrB,KAAKwC,SAChC6K,QAAS,WAAa,OAAOrN,MAE7B0N,KAAM,SAASwE,EAAM9P,GACjB,MAAoB,OAAhBpC,KAAKwC,OACEgE,KAAK4X,GACW,MAAhBpe,KAAKwC,OACLgE,KAAK6X,OADT,GAKX1Q,QAAS,WACL,MAAoB,OAAhB3N,KAAKwC,OACE,UACgB,MAAhBxC,KAAKwC,OACL,cADJ,GAKXoJ,MAAO,WAAa,OAAO5L,KAAKwC,QAEhCwL,IAAK,WACD,MAAoB,OAAhBhO,KAAKwC,OACE,QACgB,MAAhBxC,KAAKwC,OACL,SADJ,GAKX0Q,WAAY,WACD,OAAAlT,KAAK0N,OAAS,GAGzBjH,IAAK,WACD,OAAIzG,KAAK0N,OAAS,EACP1N,KAEAqK,EAAIC,eAAetK,OAIlC+P,UAAW,WACP,MAAO,CAAC/P,KAAK4L,YAIrBb,EAAMgD,EAAI,IAAIhD,EAAM,KACpBA,EAAMuT,GAAK,IAAIvT,EAAM,MAKrB4B,EAAI9K,UAAY,IAAImK,EAEpB3C,EAAE4D,OAAON,EAAI9K,UAAW,CACpB0M,KAAM,WAAoB,OAAAvO,KAAK4L,SAC/B4C,MAAO,WAAoB,OAAAxO,KAAKyG,OAChC4G,QAAS,WAAa,OAAOrN,MAC7B2N,QAAS,WAAoB,OAAA3N,KAAK4L,SAGlC+J,IAAKhK,EACLqL,IAAKrL,EAGLgI,OAAQhI,EAER0E,WAAY,WAAoB,OAAArQ,KAAKuT,MAAMqD,UAG3CnQ,IAAKkF,EAEL6E,iBAAkB,WAAa,OAAO,GAEtCsC,QAASnH,EAETuH,WAAY,WACD,OAAAlT,KAAK0N,OAAS,GAGzByF,WAAY,WACD,OAAAnT,KAAK0N,OAAS,GAGzB0F,iBAAkB,WACd,OAAOpT,KAAKkT,aAAelT,KAAOA,KAAKyG,OAI3C8M,MAAOlK,EAAE4D,OAAON,EAAI9K,UAAU0R,MAAO,CACjCI,QAAQ,EACRiD,UAAU,EACV+B,QAAQ,EACRyC,MAAM,EACN1E,UAAU,EACVG,SAAS,IAKbwD,SAAU1O,EAGVqP,iBAAkB,WACV3X,IAAAA,GAAS,GAAKrD,KAAKgF,GAAG3B,MAAM,oCAChC,OAAIA,EACOmD,KAAK+X,IACR,GAEClb,EAAM,GAAKA,EAAM,GAAG7F,OAAS,IAE7B6F,EAAM,IAAMA,EAAM,GAAK,IAGrB,GAIfyX,WAAYnP,IAYhBiB,EAAS/K,UAAY,IAAI8K,EAEzBtD,EAAE4D,OAAOL,EAAS/K,UAAW,CACzBqL,KAAMN,EACNvL,KAAM,WAAa,MAAO,CAACrB,KAAKgF,EAAGhF,KAAK+M,IACxCW,KAAM,WAAa,OAAO1N,KAAKgF,EAAIhF,KAAK+M,GAExCnB,MAAO,WACI,OAAA5L,KAAKgF,EAAEsJ,WAAa,IAAMtO,KAAK+M,EAAEuB,YAG5CN,IAAK,WACGA,IAAAA,EAAM,UAAYxH,KAAKC,IAAIzG,KAAKgF,GAAGsJ,WAAa,KAAOtO,KAAK+M,EAAEuB,WAAa,IACxE,OAAAtO,KAAKgF,EAAI,EAAI,IAAMgJ,EAAMA,GAGpC2H,IAAK,SAASzV,EAAKkC,GACXlC,OAAAA,aAAe0M,EACR,IAAIA,EAAS5M,KAAKgF,EAAI9E,EAAI6M,EAAI/M,KAAK+M,EAAI7M,EAAI8E,EAAGhF,KAAK+M,EAAI7M,EAAI6M,GAAG6B,UAE9D1O,EAAIyV,IAAI3V,KAAMoC,IAI7B4U,IAAK,SAAS9W,EAAKkC,GACXlC,OAAAA,aAAe0M,EACR,IAAIA,EAAS5M,KAAKgF,EAAI9E,EAAI8E,EAAGhF,KAAK+M,EAAI7M,EAAI6M,GAAG6B,UAE7C1O,EAAI8W,IAAIhX,KAAMoC,IAI7BwM,QAAS,WACD4P,IAAAA,EAAM7R,EAAImG,QAAQ9S,KAAKgF,EAAGhF,KAAK+M,GAE/B/H,EAAIhF,KAAKgF,EAAIwZ,EACbzR,EAAI/M,KAAK+M,EAAIyR,EAEbzR,OAAM,IAANA,EACO,IAAI9B,EAAIjG,GAER,IAAI4H,EAAS5H,EAAG+H,IAI/B4G,OAAQ,WACG,OAAA,IAAI/G,GAAU5M,KAAKgF,EAAGhF,KAAK+M,IAGtCtG,IAAK,WACD,OAAO,IAAImG,EAASpG,KAAKC,IAAIzG,KAAKgF,GAAIhF,KAAK+M,IAG/C+F,QAAS,SAASnE,GAGVA,OAAAA,aAAkB/B,EAMX,IAAIA,EAHKD,EAAImG,QAAQ9S,KAAKgF,EAAI2J,EAAO5B,EAAG4B,EAAO3J,EAAIhF,KAAK+M,GAC7C/M,KAAK+M,EAAI4B,EAAO5B,GAEU6B,UACrCD,aAAkB1D,EAClB,IAAI2B,EAASD,EAAImG,QAAQ9S,KAAKgF,EAAG2J,EAAO3J,GAAIhF,KAAK+M,GAEjD4B,EAAOmE,QAAQ9S,OAK9BoQ,WAAY,SAAS/D,GACbA,GAAAA,aAAepB,EAAK,CACpB,IAAIqP,EAAWjO,EAAIqB,OAAS,EACxBjH,EAAM4F,EAAI5F,MAAMiH,OAChB1I,EAAIwB,KAAKlG,IAAIN,KAAKgF,EAAGyB,GACrBsG,EAAIvG,KAAKlG,IAAIN,KAAK+M,EAAGtG,GACzB,OAAI6T,EACO,IAAI1N,EAAS5H,EAAG+H,GAAG6B,UAEnB,IAAIhC,EAASG,EAAG/H,GAAG4J,UAGvB,OAAA,IAAIzD,EAAMnL,KAAK0N,QAAQ0C,WAAW/D,IAIjD2G,eAAgB,WACZ,OAAO,IAAI/H,EAAIjL,KAAK+M,IAGxBsN,SAAU,WAAa,OAAO,GAE9BS,WAAY,WAAa,OAAO9a,QAMpCiL,EAAIpJ,UAAY,IAAI+K,EAAS,EAAG,GAEhCvD,EAAE4D,OAAOhC,EAAIpJ,UAAW,CACpBqL,KAAMjC,EACN5J,KAAM,WAAoB,MAAA,CAACrB,KAAKgF,IAChC4G,MAAO,WAAa,OAAO5L,KAAKgF,EAAEsJ,YAClCN,IAAK,WAAa,OAAOhO,KAAKgF,EAAEsJ,YAChCqF,OAAQ,WAAa,OAAO,IAAI1I,GAAKjL,KAAKgF,IAC1CyB,IAAK,WAAoB,OAAA,IAAIwE,EAAIzE,KAAKC,IAAIzG,KAAKgF,KAC/CqV,SAAU,WAAa,OAAO,GAC9BvH,QAAS,SAASnE,GACVA,OAAAA,aAAkB1D,EACX,IAAIA,EAAI0B,EAAImG,QAAQ9S,KAAKgF,EAAG2J,EAAO3J,IAEnC2J,EAAOmE,QAAQ9S,SAKlCqJ,EAAE4D,OAAOhC,EAAK,CACVtJ,OAAQ,SAASqD,GAAY,OAAA,IAAIiG,EAAIjG,GAAGqG,QAAQ,cAKpDF,EAAMtJ,UAAY,IAAI8K,EAEtBtD,EAAE4D,OAAO9B,EAAMtJ,UAAW,CACtBqL,KAAM/B,EACN9J,KAAM,WAAoB,MAAA,CAACrB,KAAKgF,IAChC0I,KAAM,WAAa,OAAO1N,KAAKgF,GAI/B4G,MAAO,WAAa,OAAO5L,KAAKgF,EAAEsJ,YAClCN,IAAK,WAAa,OAAOhO,KAAKgF,EAAEsJ,YAEhCqH,IAAK,SAASzV,EAAKkC,GACf,OAAIA,GAAWA,EAAQyY,cACZ1P,EAAMsT,gBACTze,KAAKgF,EAAI9E,EAAIwN,OACblH,KAAK+X,IAAIve,KAAKgb,mBAAoB9a,EAAI8a,qBAGnC,IAAI7P,EAAMnL,KAAKgF,EAAI9E,EAAIwN,QAAQkB,WAI9CoI,IAAK,SAAS9W,EAAKkC,GACf,OAAIA,GAAWA,EAAQyY,cACZ1P,EAAMsT,gBACTze,KAAKgF,EAAI9E,EAAIwN,OACb1N,KAAKgb,mBAAqB9a,EAAI8a,oBAG3B,IAAI7P,EAAMnL,KAAKgF,EAAI9E,EAAIwN,QAAQkB,WAI9CA,QAAS,WAGL,OAAO5O,MAGX2T,OAAQ,WAAa,OAAO,IAAIxI,GAAOnL,KAAKgF,IAC5CyB,IAAK,WAAoB,OAAA,IAAI0E,EAAM3E,KAAKC,IAAIzG,KAAKgF,KAEjD8N,QAAS,SAASnE,GACVA,OAAAA,aAAkBhC,EACX,IAAIxB,EAAMwB,EAAImG,QAAQ9S,KAAK0N,OAAQiB,EAAOjB,SAASkB,UAEnDD,EAAOmE,QAAQ9S,OAK9BoQ,WAAY,SAAS/D,EAAKjK,GACtB,OAAIA,GAAWA,EAAQyY,eACfxO,aAAepB,GAAOoB,EAAIrH,EAAI,EAC3BmG,EAAMsT,gBACT,IAAI5T,EAAI7K,KAAMqM,GAAKqB,OACnB1N,KAAKgb,mBAAqB3O,EAAIrH,GAG3B,IAAImG,EAAM,IAAIN,EAAI7K,KAAMqM,GAAKqB,QAAQkB,WAKpDkM,WAAY,WACJ4D,IAAAA,EAAQ1e,KAAKgF,EAAEsJ,WAAW7J,MAAM,KACpC,OAAqB,IAAjBia,EAAMlhB,OACC,IAAIoP,EAAS5M,KAAKgF,EAAG,GAIrB,IAAI4H,EAFK1B,OAAOwT,EAAMvb,KAAK,KAChBqD,KAAKlG,IAAI,GAAIoe,EAAM,GAAGlhB,SACIoR,WAIpDoE,eAAgB,WACZ,OAAOhT,KAAK8a,aAAa9H,kBAG7BqH,SAAU,WAAa,OAAO,KAGlChR,EAAE4D,OAAO9B,EAAO,CACZxJ,OAAQ,SAASqD,GAAY,OAAA,IAAImG,EAAMnG,GAAGqG,QAAQ,YAIlDoT,gBAAiB,SAASzZ,EAAG2Z,GACzB,OAAO,IAAIxT,GAAOnG,EAAE4N,QAAQpM,KAAK8L,IAAIqM,EAAQ,MAAM/P,aAK3DvF,EAAE4D,OAAON,EAAK,CACV6L,YAAa,SAASnF,GACdA,MAAS,aAATA,EACO1G,EAAIiS,IACK,WAATvL,EACA1G,EAAIgK,IAEJhK,EAAIiH,KAKnBd,QAAS,SAASiD,EAAGC,GACjB,IAAI6I,EAQJ,GANA9I,EAAIvP,KAAKC,IAAIsP,GACbC,EAAIxP,KAAKC,IAAIuP,GAKTD,IAAMvP,KAAK2L,MAAM4D,IAAMC,IAAMxP,KAAK2L,MAAM6D,GACxC,OAAO,EAGX,KAAOA,GACH6I,EAAM9I,EAAIC,EACVD,EAAIC,EACJA,EAAI6I,EAGR,OAAO9I,GAGXzD,IAAK,WACD,OAAOjJ,EAAEiJ,IAAIjJ,EAAE8C,QAAQ3K,YAAY,SAAStB,GACjCA,OAAAA,EAAIwN,WAInB6Q,IAAK,WACD,OAAOlV,EAAEkV,IAAIlV,EAAE8C,QAAQ3K,YAAY,SAAStB,GACjCA,OAAAA,EAAIwN,aAKvBf,EAAIiH,IAAM,IAAI3I,GAAK,GAAGI,QAAQ,UAC9BsB,EAAIiS,IAAM,IAAI3T,GAAK,GAAGI,QAAQ,YAC9BsB,EAAIgK,IAAM,IAAI1L,GAAK,GAAGI,QAAQ,UAE9BsB,EAAI6O,KAAO,IAAI5O,EAAS,EAAG,GAAGvB,QAAQ,QAEtCsB,EAAI+K,KAAO,IAAIzM,EAAI,GACnB0B,EAAIoG,IAAM,IAAI9H,EAAI,GAClB0B,EAAIiP,IAAM,IAAI3Q,EAAI,IAIlBd,EAAItI,UAAUsS,SAAWxH,EAAI+K,KAC7BrN,EAAIxI,UAAUsS,SAAWxH,EAAIoG,IAS7B5V,EAAOY,GAAK,CACRoM,IAAKA,EACLE,IAAKA,EACLQ,IAAKA,EACLJ,IAAKA,EACLG,KAAMA,EACNV,GAAIA,EACJqB,IAAKA,EACLC,KAAMA,EACNT,MAAOA,EACPD,IAAKA,EACLG,IAAKA,EACLE,MAAOA,EACP1K,WApBa,SAASC,EAAKC,GAErB,MAAA,IAAIE,MAAMF,EAAK4C,IAAII,eAoBzBmb,UAAW,CAAC,KACZrT,YAAa,SAASjJ,GAClB,OAAI6G,EAAE4T,SAAS9f,EAAOY,GAAG+gB,UAAWtc,GACzB,QACA6G,EAAE4T,SAAS9f,EAAOY,GAAG8d,UAAWrZ,GAChC,OAEA,QAKZ,IAAM1B,EAAQ,SAASC,EAAOqB,GAC7B,IAiBO,OAhBHA,GAAWA,EAAQyZ,UAEnB1e,EAAOY,GAAG8d,UAAYxS,EAAEqR,QAAQtY,EAAQyZ,UAAW,KAEnD1e,EAAOY,GAAG8d,UAAY,GAOtBzZ,GAAWA,EAAQ2c,oBACnBhe,EAAQA,EAAM0D,MAAMrC,EAAQ2c,mBAAmB5b,KAAK,MAIjD,CAAE8a,QAAQ,EAAM3K,KADZnW,EAAO2D,MAAMC,GAAOqK,iBAEjC,MAAO2C,GACE,MAAA,CAAEkQ,QAAQ,EAAOhgB,MAAO8P,EAAElC,WAKlC,SAAS+F,EAAKpP,GACZA,KAAAA,OAASA,EAElBoP,EAAK/P,UAAY,IAAI4K,EAMrB,IAAIuS,EAAc,SAASxc,GACvB,GAAI6G,EAAE4V,GAAW/O,IAAI1N,IAAW6G,EAAE6V,GAAchP,IAAI1N,GAChD,OAAO,IAAIoP,EAAKpP,GAIpB,IAAI2c,EAAS9V,EAAEA,EAAE+V,GAAYC,QAAQxG,MAAK,SAASyG,GACxC,OAAA,IAAIC,OAAO,IAAMD,GAAYE,KAAKhd,MAG7C,GAAI2c,EAAQ,CACR,IAAI/S,EAAO5J,EAAO2C,QAAQ,IAAIoa,OAAO,IAAMJ,GAAS,IAQhD9V,GAAAA,EAAE4V,GAAW/O,IAAI9D,IAChB8S,EAAa9S,IACb8S,EAAa9S,GAAMqT,WAAaC,EAEjC,OAAO,IAAIrV,EAAI+U,EAAWD,GAAS,IAAIvN,EAAKxF,IAE5C,MAAM,IAAIvL,MAAMuL,EAAO,4BAG3B,OAAO,IAAIwF,EAAKpP,IAIXmd,EAAY,SAAS5e,GAC1B,IACI6e,IAAAA,EAAc1Y,EAAWpG,MAAMC,GAiB/B8e,EAAY,GAEhBxW,EAAEuW,EAAYxhB,KAAK8B,KAAKmS,MAAK,SAASyN,GAClCD,EAAU3d,KACN,IAAI2I,EAAImU,EAAYc,EAASzf,MAAO,IAAI4K,EAAI6U,EAASxf,UAI7D+I,EAAEuW,EAAYxhB,KAAK+B,OAAOkS,MAAK,SAASyN,GACpCD,EAAU3d,KACN,IAAI2I,EAAImU,EAAYc,EAASzf,MAAO,IAAI4K,GAAK,EAAI6U,EAASxf,UAI9DlC,IAAAA,EAAO,IAAIiM,EAAIwV,GAAWjQ,UAE9B,MAAyB,kBAArBgQ,EAAY7f,KAML,CACHke,QAAQ,EACR7f,KAAMA,EACNkV,KAJO,IAAIjJ,EADX,CAAC,IAAIc,GAAOyU,EAAYzhB,YAAYiC,OAAOyf,IAM3CE,YAAaH,EAAYzhB,UACzB4B,KAAM6f,EAAY7f,MAKf,CACHke,QAAQ,EACR7f,KAAMA,EACN2B,KAAM6f,EAAY7f,MAG5B,MAAOgO,GACE,MAAA,CAAEkQ,QAAQ,EAAOhgB,MAAO8P,EAAElC,WAIzCxC,EAAE4D,OAAO2E,EAAK/P,UAAW,CACrBqL,KAAM0E,EACNvQ,KAAM,WAAoB,MAAA,CAACrB,KAAKwC,SAChC6K,QAAS,WAAa,OAAOrN,MAE7B0N,KAAM,SAASwE,EAAM9P,GAQjB,OAAO,GAGX4N,SAAU,WAAa,MAAO,CAAC,CAAE5R,KAAM4B,KAAKwC,OAAQlC,IAAK,KAEzDqN,QAAS,WAAa,MAAO,KAE7B/B,MAAO,WAAa,OAAO5L,KAAKwC,QAEhCwL,IAAK,WAAa,OAAOhO,KAAKwC,QAG9BoM,QAAS,SAASxM,GACViH,GAAAA,EAAE4V,GAAW/O,IAAIlQ,KAAKwC,QACtB,OAAOxC,KACJ,GAAIqJ,EAAE6V,GAAchP,IAAIlQ,KAAKwC,QAChC,OAAO0c,EAAalf,KAAKwC,QAAQwd,WAEjC,MAAM,IAAInf,MAAM,8BAAgCb,KAAKwC,WAKjE,IAAIyc,EAAY,CACZgB,EAAG,IAAIrO,EAAK,KAEZsO,EAAG,IAAItO,EAAK,KACZuO,EAAG,IAAIvO,EAAK,KACZwO,EAAG,IAAIxO,EAAK,KACZyO,EAAG,IAAIzO,EAAK,KACZ0O,IAAK,IAAI1O,EAAK,OACd2O,GAAI,IAAI3O,EAAK,OAGbwN,EAAa,CACbrJ,EAAG,IAAIlL,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,KACjCuV,EAAG,IAAI3V,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,KACjCrI,EAAG,IAAIiI,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,KACjCjG,EAAG,IAAI6F,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,IACjCwV,EAAG,IAAI5V,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,IACjCgV,EAAG,IAAIpV,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,IACjC1F,EAAG,IAAIsF,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,IACjC8B,EAAG,IAAIlC,EAAI,IAAII,EAAI,IAAK,IAAIA,GAAK,IACjCyV,GAAI,IAAIzV,EAAI,IACZ0V,EAAG,IAAI9V,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,IAChC5N,EAAG,IAAIwN,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,IAChC2V,EAAG,IAAI/V,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,IAChC4V,EAAG,IAAIhW,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,IAChC6V,EAAG,IAAIjW,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,KAChC8V,EAAG,IAAIlW,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,KAChCoT,EAAG,IAAIxT,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,KAEhC+V,MAAO,IAAInW,EAAI,IAAII,EAAI,IAAK,IAAIA,EAAI,MAIpCyU,EAAc,GACduB,EAAgB,GAEhBC,EAAY,SAASxgB,EAAK+e,GAC1B,IAAI0B,EAASzgB,EAAI+D,MAAM,KACnB2c,EAAiBD,EAAO,GAAGE,OAC3BC,EAAWH,EAAO,GAAGE,OAErBtB,EAAcpT,EAAIoG,IACC,KAAnBqO,IACArB,EAAcjf,EAAMsgB,GAAgB9N,MAGxC,IAAIiO,EAAcD,EAAS7c,MAAM,KAC7B+c,EAAW,CAACzB,GAsBT,OApBHwB,EAAY,IACZA,EAAY,GACP9c,MAAM,KACN+K,QAAO,SAASuO,GACNA,MAAM,KAANA,KACRvQ,KAAI,SAASuQ,GACZyD,EAAStf,KAAK,IAAI0P,EAAKmM,OAI/BwD,EAAY,IACZA,EAAY,GACP9c,MAAM,KACN+K,QAAO,SAASuO,GACNA,MAAM,KAANA,KACRvQ,KAAI,SAASuQ,GACZyD,EAAStf,KAAK,IAAI2I,EAAI,IAAI+G,EAAKmM,GAAIpR,EAAIgK,SAI5C,CACHqJ,WAAY,IAAI3V,EAAImX,GACpB/B,SAAUA,IA0BdP,EAAe,CAGfuC,GAAIP,EAAU,4BAA6BxB,GAC3Ce,EAAGS,EAAU,OAAQD,GAGrBS,MAASR,EAAU,MAAOD,GAC1BU,OAAUT,EAAU,MAAOD,GAC3BW,GAAMV,EAAU,kBAAmBD,GACnCY,GAAMX,EAAU,oBAAqBD,GACrCa,GAAMZ,EAAU,oBAAqBD,GACrCc,GAAMb,EAAU,qBAAsBD,GACtCe,GAAMd,EAAU,qBAAsBD,GACtCgB,IAAOf,EAAU,WAAYD,GAC7B,IAAKC,EAAU,aAAcD,GAC7BiB,GAAMhB,EAAU,qBAAsBD,GAGtC3O,IAAO4O,EAAU,SAAUD,GAC3BkB,GAAMjB,EAAU,WAAYD,GAC5BlF,IAAOmF,EAAU,MAAOD,GAExBmB,IAAOlB,EAAU,YAAaD,GAC9BoB,GAAMnB,EAAU,aAAcD,GAC9BqB,UAAapB,EAAU,WAAYD,GACnCsB,MAASrB,EAAU,YAAaD,GAChCuB,SAAYtB,EAAU,gBAAiBD,GAGvC,KAAMC,EAAU,QAASD,GACzB,KAAMC,EAAU,UAAWD,GAC3B,KAAMC,EAAU,UAAWD,GAG3BlT,EAAKmT,EAAU,4BAA6BD,GAG5C1b,EAAK2b,EAAU,oBAAqBD,GACpCwB,GAAMvB,EAAU,mBAAoBD,GACpCyB,GAAMxB,EAAU,OAAQD,GACxB0B,KAAQzB,EAAU,OAAQD,GAG1B2B,EAAK1B,EAAU,QAASxB,GACxBmD,IAAO3B,EAAU,WAAYD,GAC7B6B,IAAO5B,EAAU,kBAAmBxB,GACpCqD,GAAM7B,EAAU,2BAA4BxB,GAC5CsD,IAAO9B,EAAU,YAAaxB,GAG9BuD,EAAK/B,EAAU,UAAWxB,GAC1B,MAAOwB,EAAU,SAAUD,GAG3BiC,EAAKhC,EAAU,mBAAoBxB,GAGnCyD,GAAMjC,EAAU,8BAA+BD,GAC/CmC,IAAOlC,EAAU,YAAaD,GAG9BoC,GAAMnC,EAAU,gBAAiBxB,GACjC4D,IAAOpC,EAAU,YAAaxB,GAC9B,IAAKwB,EAAU,eAAgBD,GAC/B,IAAKC,EAAU,QAASD,GACxBsC,IAAOrC,EAAU,cAAeD,GAChCuC,KAAQtC,EAAU,cAAeD,GACjCwC,KAAQvC,EAAU,SAAUD,GAG5ByC,GAAMxC,EAAU,aAAcD,GAC9BjL,EAAKkL,EAAU,eAAgBxB,GAC/BiE,KAAQzC,EAAU,MAAOxB,GACzBkE,KAAQ1C,EAAU,gBAAiBD,GACnC4C,SAAY3C,EAAU,eAAgBD,GACtC6C,SAAY5C,EAAU,eAAgBD,GACtC8C,KAAQ7C,EAAU,eAAgBD,GAGlC+C,EAAK9C,EAAU,iBAAkBxB,GACjCuE,IAAO/C,EAAU,gBAAiBxB,GAClCwE,IAAOhD,EAAU,aAAcD,GAC/BkD,GAAMjD,EAAU,YAAaD,GAC7BmD,MAASlD,EAAU,OAAQD,GAC3Bre,EAAKse,EAAU,YAAaD,GAC5BoD,GAAMnD,EAAU,MAAOD,GACvBqD,KAAQpD,EAAU,MAAOD,GACzB,QAASC,EAAU,YAAaD,GAChC,UAAWC,EAAU,YAAaD,GAClCsD,KAAQrD,EAAU,aAAcD,GAChCuD,IAAOtD,EAAU,aAAcD,GAI/BwD,IAAOvD,EAAU,aAAcD,GAC/ByD,IAAOxD,EAAU,eAAgBD,GACjC,IAAKC,EAAU,QAASD,GACxB0D,UAAazD,EAAU,aAAcD,GACrC1E,OAAU2E,EAAU,eAAgBD,GAMpC2D,GAAM1D,EAAU,YAAaxB,GAC7BmF,MAAS3D,EAAU,OAAQD,GAE3BX,IAAOY,EAAU,yBAA0BxB,GAC3C,IAAKwB,EAAU,UAAWD,GAC1B6D,QAAW5D,EAAU,MAAOD,GAC5B8D,IAAO7D,EAAU,cAAeD,GAGhC+D,EAAK9D,EAAU,uBAAwBxB,GACvCuF,EAAK/D,EAAU,QAASxB,GACxBwF,OAAUhE,EAAU,MAAOD,GAC3B,IAAKC,EAAU,UAAWxB,GAC1ByF,IAAOjE,EAAU,MAAOD,GACxBmE,EAAKlE,EAAU,UAAWxB,GAC1B2F,EAAKnE,EAAU,UAAWxB,GAC1BoB,EAAKI,EAAU,iBAAkBxB,GACjC4F,GAAMpE,EAAU,qBAAsBxB,GAItC6F,GAAMrE,EAAU,uBAAwBD,GACxCuE,GAAMtE,EAAU,aAAcD,GAC9BwE,IAAOvE,EAAU,aAAcD,GAC/ByE,GAAMxE,EAAU,kBAAmBD,GACnC0E,MAASzE,EAAU,SAAUD,GAC7B2E,SAAY1E,EAAU,wBAAyBD,GAC/C4E,QAAW3E,EAAU,aAAcD,GACnC6E,IAAO5E,EAAU,aAAcD,GAC/B8E,GAAM7E,EAAU,OAAQD,GACxB+E,GAAM9E,EAAU,OAAQD,GACxBgF,GAAM/E,EAAU,aAAcD,GAC9BiF,KAAQhF,EAAU,OAAQD,GAC1BkF,KAAQjF,EAAU,cAAeD,GAGjCmF,GAAMlF,EAAU,QAASxB,IAGhBhI,EAAO/K,EAAI+K,KACX3E,EAAMpG,EAAIoG,IC36GV3B,EAAU,SAASS,EAAOC,EAAO1P,GAC1C,IAAI8L,EAAW,CACXmY,MAAM,EACNtX,UAAU,GAWV3M,OAFYmS,IAAZnS,EAEUiH,EAAE4D,OAAOiB,EAAU9L,GAEnB8L,EAMd,IAEQrC,EAFJqG,EAAOL,EAAMpB,SAASqB,GAC1B,OAAKI,EAAKhB,MAoBLW,EAAMT,QAAQU,GAKf1P,EAAQikB,OAASxU,EAAMgB,SAASf,GACzB,CACHZ,OAAO,EACPrF,QAAS,2CAKbzJ,EAAQ2M,WAAa8C,EAAMvC,eACpB,CACH4B,OAAO,EACPrF,QAAS,qDAIV,CAACqF,OAAO,EAAMrF,QAAS,MAnBnB,CAACqF,OAAO,EAAOrF,QAAS,OAlB3BA,EADAqG,EAAKf,kBAED,+EAIA,oFAGD,CACHD,OAAO,EACPoV,kBAAmBpU,EAAKf,kBACxBoV,oBAAqBrU,EAAKf,kBAC1BtF,QAASA"}
|