From 43c3d060b0df7e80f5b6af80de60617ddf36d4ea Mon Sep 17 00:00:00 2001 From: mcDandy Date: Sat, 10 Jan 2026 14:13:44 +0100 Subject: [PATCH] add statistical functions --- README.md | 5 + more_math/Parser/MathExpr.g4 | 377 ++-- more_math/Parser/MathExpr.interp | 36 +- more_math/Parser/MathExpr.tokens | 299 +-- more_math/Parser/MathExprLexer.interp | 53 +- more_math/Parser/MathExprLexer.py | 611 +++--- more_math/Parser/MathExprLexer.tokens | 299 +-- more_math/Parser/MathExprListener.py | 72 + more_math/Parser/MathExprParser.py | 2618 ++++++++++++++++++------ more_math/Parser/MathExprVisitor.py | 37 +- more_math/Parser/UnifiedMathVisitor.py | 93 + 11 files changed, 3061 insertions(+), 1439 deletions(-) diff --git a/README.md b/README.md index fda5d0e..1198629 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,11 @@ You can also get the node from comfy manager under the name of More math. - `tmax(x, y)`: Element-wise maximum of x and y. - `smin(x, ...)`: Scalar minimum. Returns the single smallest value across all input tensors/values. - `smax(x, ...)`: Scalar maximum. Returns the single largest value across all input tensors/values. +- `sum(x)`: Sum of all elements. +- `mean(x)`: Mean value of all elements. +- `std(x)`: Standard deviation of all elements. +- `var(x)`: Variance of all elements. +- `dot(a, b)`: Dot product of two tensors (flattens inputs to 1D) or lists. - `topk(x, k)`: Returns a tensor with the **top K largest** values preserved at their original positions (others zeroed). For lists, returns the top K largest items sorted descending. (uses magnitude for for complex numbers). - `botk(x, k)`: Returns a tensor with the **bottom K smallest** values preserved at their original positions (others zeroed). For lists, returns the bottom K smallest items sorted ascending. (uses magnitude for for complex numbers) - `tnorm(x)`: Tensor normalisation. Normalises x (L2 norm along last dimension). diff --git a/more_math/Parser/MathExpr.g4 b/more_math/Parser/MathExpr.g4 index 81a7628..592d4fd 100644 --- a/more_math/Parser/MathExpr.g4 +++ b/more_math/Parser/MathExpr.g4 @@ -1,215 +1,208 @@ grammar MathExpr; // Top-level expression, with operator precedence (lowest to highest) -expr - : atom | compExpr - ; +expr: atom | compExpr; -compExpr - : compExpr GT addExpr # GtExp - | compExpr GE addExpr # GeExp - | compExpr LT addExpr # LtExp - | compExpr LE addExpr # LeExp - | compExpr EQ addExpr # EqExp - | compExpr NE addExpr # NeExp - | addExpr # ToAdd - ; +compExpr: + compExpr GT addExpr # GtExp + | compExpr GE addExpr # GeExp + | compExpr LT addExpr # LtExp + | compExpr LE addExpr # LeExp + | compExpr EQ addExpr # EqExp + | compExpr NE addExpr # NeExp + | addExpr # ToAdd; -addExpr - : addExpr PLUS mulExpr # AddExp - | addExpr MINUS mulExpr # SubExp - | mulExpr # ToMul - ; +addExpr: + addExpr PLUS mulExpr # AddExp + | addExpr MINUS mulExpr # SubExp + | mulExpr # ToMul; -mulExpr - : mulExpr MULT powExpr # MulExp - | mulExpr DIV powExpr # DivExp - | mulExpr MOD powExpr # ModExp - | powExpr # ToPow - ; +mulExpr: + mulExpr MULT powExpr # MulExp + | mulExpr DIV powExpr # DivExp + | mulExpr MOD powExpr # ModExp + | powExpr # ToPow; -powExpr - : unaryExpr POW powExpr # PowExp - | unaryExpr # ToUnary - ; +powExpr: unaryExpr POW powExpr # PowExp | unaryExpr # ToUnary; -unaryExpr - : PLUS unaryExpr # UnaryPlus - | MINUS unaryExpr # UnaryMinus - | atom # ToAtom - ; +unaryExpr: + PLUS unaryExpr # UnaryPlus + | MINUS unaryExpr # UnaryMinus + | atom # ToAtom; // Atoms: function calls, variable, number, constant, or parenthesized expression -atom - : func1 # Func1Exp - | func2 # Func2Exp - | func3 # Func3Exp - | func4 # Func4Exp - | funcN # FuncNExp - | VARIABLE # VariableExp - | NUMBER # NumberExp - | CONSTANT # ConstantExp - | LPAREN expr RPAREN # ParenExp - | PIPE expr PIPE # AbsExp - | LBRACKET expr (COMMA expr)* RBRACKET # ListExp - ; +atom: + func1 # Func1Exp + | func2 # Func2Exp + | func3 # Func3Exp + | func4 # Func4Exp + | funcN # FuncNExp + | VARIABLE # VariableExp + | NUMBER # NumberExp + | CONSTANT # ConstantExp + | LPAREN expr RPAREN # ParenExp + | PIPE expr PIPE # AbsExp + | LBRACKET expr (COMMA expr)* RBRACKET # ListExp; // Single-argument functions -func1 - : SIN LPAREN expr RPAREN # SinFunc - | COS LPAREN expr RPAREN # CosFunc - | TAN LPAREN expr RPAREN # TanFunc - | ASIN LPAREN expr RPAREN # AsinFunc - | ACOS LPAREN expr RPAREN # AcosFunc - | ATAN LPAREN expr RPAREN # AtanFunc - | SINH LPAREN expr RPAREN # SinhFunc - | COSH LPAREN expr RPAREN # CoshFunc - | TANH LPAREN expr RPAREN # TanhFunc - | ASINH LPAREN expr RPAREN # AsinhFunc - | ACOSH LPAREN expr RPAREN # AcoshFunc - | ATANH LPAREN expr RPAREN # AtanhFunc - | ABS LPAREN expr RPAREN # AbsFunc - | SQRT LPAREN expr RPAREN # SqrtFunc - | LN LPAREN expr RPAREN # LnFunc - | LOG LPAREN expr RPAREN # LogFunc - | EXP LPAREN expr RPAREN # ExpFunc - | TNORM LPAREN expr RPAREN # TNormFunc - | SNORM LPAREN expr RPAREN # SNormFunc - | FLOOR LPAREN expr RPAREN # FloorFunc - | CEIL LPAREN expr RPAREN # CeilFunc - | ROUND LPAREN expr RPAREN # RoundFunc - | GAMMA LPAREN expr RPAREN # GammaFunc - | SIGM LPAREN expr RPAREN # sigmoidFunc - | SFFT LPAREN expr RPAREN # sfftFunc - | SIFFT LPAREN expr RPAREN # sifftFunc - | ANGL LPAREN expr RPAREN # anglFunc - | PRNT LPAREN expr RPAREN # printFunc - | FRACT LPAREN expr RPAREN # FractFunc - | RELU LPAREN expr RPAREN # ReluFunc - | SOFTPLUS LPAREN expr RPAREN # SoftplusFunc - | GELU LPAREN expr RPAREN # GeluFunc - | SIGN LPAREN expr RPAREN # SignFunc - | PRINT_SHAPE LPAREN expr RPAREN # PrintShapeFunc - | PINV LPAREN expr RPAREN # PinvFunc - | SUM LPAREN expr RPAREN # SumFunc - | MEAN LPAREN expr RPAREN # MeanFunc - | STD LPAREN expr RPAREN # StdFunc - | VAR LPAREN expr RPAREN # VarFunc - | MEDIAN LPAREN expr RPAREN # MedianFunc - ; +func1: + SIN LPAREN expr RPAREN # SinFunc + | COS LPAREN expr RPAREN # CosFunc + | TAN LPAREN expr RPAREN # TanFunc + | ASIN LPAREN expr RPAREN # AsinFunc + | ACOS LPAREN expr RPAREN # AcosFunc + | ATAN LPAREN expr RPAREN # AtanFunc + | SINH LPAREN expr RPAREN # SinhFunc + | COSH LPAREN expr RPAREN # CoshFunc + | TANH LPAREN expr RPAREN # TanhFunc + | ASINH LPAREN expr RPAREN # AsinhFunc + | ACOSH LPAREN expr RPAREN # AcoshFunc + | ATANH LPAREN expr RPAREN # AtanhFunc + | ABS LPAREN expr RPAREN # AbsFunc + | SQRT LPAREN expr RPAREN # SqrtFunc + | LN LPAREN expr RPAREN # LnFunc + | LOG LPAREN expr RPAREN # LogFunc + | EXP LPAREN expr RPAREN # ExpFunc + | TNORM LPAREN expr RPAREN # TNormFunc + | SNORM LPAREN expr RPAREN # SNormFunc + | FLOOR LPAREN expr RPAREN # FloorFunc + | CEIL LPAREN expr RPAREN # CeilFunc + | ROUND LPAREN expr RPAREN # RoundFunc + | GAMMA LPAREN expr RPAREN # GammaFunc + | SIGM LPAREN expr RPAREN # sigmoidFunc + | SFFT LPAREN expr RPAREN # sfftFunc + | SIFFT LPAREN expr RPAREN # sifftFunc + | ANGL LPAREN expr RPAREN # anglFunc + | PRNT LPAREN expr RPAREN # printFunc + | FRACT LPAREN expr RPAREN # FractFunc + | RELU LPAREN expr RPAREN # ReluFunc + | SOFTPLUS LPAREN expr RPAREN # SoftplusFunc + | GELU LPAREN expr RPAREN # GeluFunc + | SIGN LPAREN expr RPAREN # SignFunc + | PRINT_SHAPE LPAREN expr RPAREN # PrintShapeFunc + | PINV LPAREN expr RPAREN # PinvFunc + | SUM LPAREN expr RPAREN # SumFunc + | MEAN LPAREN expr RPAREN # MeanFunc + | STD LPAREN expr RPAREN # StdFunc + | VAR LPAREN expr RPAREN # VarFunc; -// Two-argument functions -func2 - : POWE LPAREN expr COMMA expr RPAREN # PowFunc - | ATAN2 LPAREN expr COMMA expr RPAREN # Atan2Func - | TMIN LPAREN expr COMMA expr RPAREN # TMinFunc - | TMAX LPAREN expr COMMA expr RPAREN # TMaxFunc - | STEP LPAREN expr COMMA expr RPAREN # StepFunc - | TOPK LPAREN expr COMMA expr RPAREN # TopkFunc - | BOTK LPAREN expr COMMA expr RPAREN # BotkFunc - | DOT LPAREN expr COMMA expr RPAREN # DotFunc - ; +// Two-argument functions Two-argument functions +func2: + POWE LPAREN expr COMMA expr RPAREN # PowFunc + | ATAN2 LPAREN expr COMMA expr RPAREN # Atan2Func + | TMIN LPAREN expr COMMA expr RPAREN # TMinFunc + | TMAX LPAREN expr COMMA expr RPAREN # TMaxFunc + | STEP LPAREN expr COMMA expr RPAREN # StepFunc + | TOPK LPAREN expr COMMA expr RPAREN # TopkFunc + | BOTK LPAREN expr COMMA expr RPAREN # BotkFunc + | QUARTILE LPAREN expr COMMA expr RPAREN # QuartileFunc + | PERCENTILE LPAREN expr COMMA expr RPAREN # PercentileFunc + | DOT LPAREN expr COMMA expr RPAREN # DotFunc; -func3 - : CLAMP LPAREN expr COMMA expr COMMA expr RPAREN # ClampFunc - | LERP LPAREN expr COMMA expr COMMA expr RPAREN # LerpFunc - | SMOOTHSTEP LPAREN expr COMMA expr COMMA expr RPAREN # SmoothstepFunc - | RANGE LPAREN expr COMMA expr COMMA expr RPAREN # RangeFunc - ; +func3: + CLAMP LPAREN expr COMMA expr COMMA expr RPAREN # ClampFunc + | LERP LPAREN expr COMMA expr COMMA expr RPAREN # LerpFunc + | SMOOTHSTEP LPAREN expr COMMA expr COMMA expr RPAREN # SmoothstepFunc + | RANGE LPAREN expr COMMA expr COMMA expr RPAREN # RangeFunc; -func4 - : SWAP LPAREN expr COMMA expr COMMA expr COMMA expr RPAREN # SwapFunc - ; +func4: + SWAP LPAREN expr COMMA expr COMMA expr COMMA expr RPAREN # SwapFunc; // N-argument functions -funcN - : SMIN LPAREN expr (COMMA expr)* RPAREN # SMinFunc - | SMAX LPAREN expr (COMMA expr)* RPAREN # SMaxFunc - | MAP LPAREN expr (COMMA expr)+ RPAREN # MapFunc - | EZCONV LPAREN expr (COMMA expr)+ RPAREN # EzConvFunc - | CONV LPAREN expr (COMMA expr)+ RPAREN # ConvFunc - | PERM LPAREN expr COMMA expr RPAREN # PermuteFunc - | RESHAPE LPAREN expr COMMA expr RPAREN # ReshapeFunc - ; +funcN: + SMIN LPAREN expr (COMMA expr)* RPAREN # SMinFunc + | SMAX LPAREN expr (COMMA expr)* RPAREN # SMaxFunc + | MAP LPAREN expr (COMMA expr)+ RPAREN # MapFunc + | EZCONV LPAREN expr (COMMA expr)+ RPAREN # EzConvFunc + | CONV LPAREN expr (COMMA expr)+ RPAREN # ConvFunc + | PERM LPAREN expr COMMA expr RPAREN # PermuteFunc + | RESHAPE LPAREN expr COMMA expr RPAREN # ReshapeFunc; // LEXER RULES -SIN : 'sin'; -COS : 'cos'; -TAN : 'tan'; -ASIN : 'asin'; -ACOS : 'acos'; -ATAN : 'atan'; -ATAN2 : 'atan2'; -SINH : 'sinh'; -COSH : 'cosh'; -TANH : 'tanh'; -ASINH : 'asinh'; -ACOSH : 'acosh'; -ATANH : 'atanh'; -ABS : 'abs'; -SQRT : 'sqrt'; -LN : 'ln'; -LOG : 'log'; -EXP : 'exp'; -SMIN : 'smin'; -SMAX : 'smax'; -TMIN : 'tmin'; -TMAX : 'tmax'; -TNORM : 'tnorm'; -SNORM : 'snorm'; -FLOOR : 'floor'; -CEIL : 'ceil'; -ROUND : 'round'; -GAMMA : 'gamma'; -POWE : 'pow'; -SIGM : 'sigm'; -CLAMP : 'clamp'; -SFFT : 'fft'; -SIFFT : 'ifft'; -ANGL : 'angle'; -PRNT : 'print'; -PRINT_SHAPE : 'print_shape' | 'pshp'; -LERP : 'lerp'; -STEP : 'step'; -SMOOTHSTEP : 'smoothstep'; -FRACT : 'fract'; -RELU : 'relu'; -SOFTPLUS : 'softplus'; -GELU : 'gelu'; -SIGN : 'sign'; -MAP : 'map'; -EZCONV : 'ezconvolution' | 'ezconv'; -CONV : 'convolution' | 'conv'; -SWAP : 'swap'; -PERM : 'permute' | 'perm'; -RESHAPE : 'reshape' | 'rshp'; -RANGE : 'range'; -TOPK : 'topk'; -BOTK : 'botk'; -PINV : 'pinv'; +SIN: 'sin'; +COS: 'cos'; +TAN: 'tan'; +ASIN: 'asin'; +ACOS: 'acos'; +ATAN: 'atan'; +ATAN2: 'atan2'; +SINH: 'sinh'; +COSH: 'cosh'; +TANH: 'tanh'; +ASINH: 'asinh'; +ACOSH: 'acosh'; +ATANH: 'atanh'; +ABS: 'abs'; +SQRT: 'sqrt'; +LN: 'ln'; +LOG: 'log'; +EXP: 'exp'; +SMIN: 'smin'; +SMAX: 'smax'; +TMIN: 'tmin'; +TMAX: 'tmax'; +TNORM: 'tnorm'; +SNORM: 'snorm'; +FLOOR: 'floor'; +CEIL: 'ceil'; +ROUND: 'round'; +GAMMA: 'gamma'; +POWE: 'pow'; +SIGM: 'sigm'; +CLAMP: 'clamp'; +SFFT: 'fft'; +SIFFT: 'ifft'; +ANGL: 'angle'; +PRNT: 'print'; +PRINT_SHAPE: 'print_shape' | 'pshp'; +LERP: 'lerp'; +STEP: 'step'; +SMOOTHSTEP: 'smoothstep'; +FRACT: 'fract'; +RELU: 'relu'; +SOFTPLUS: 'softplus'; +GELU: 'gelu'; +SIGN: 'sign'; +MAP: 'map'; +EZCONV: 'ezconvolution' | 'ezconv'; +CONV: 'convolution' | 'conv'; +SWAP: 'swap'; +PERM: 'permute' | 'perm'; +RESHAPE: 'reshape' | 'rshp'; +RANGE: 'range'; +TOPK: 'topk'; +BOTK: 'botk'; +PINV: 'pinv'; +SUM: 'sum'; +MEAN: 'mean'; +STD: 'std'; +VAR: 'var'; +QUARTILE: 'quartile'; +PERCENTILE: 'percentile' | 'prcnt'; +DOT: 'dot'; -PLUS : '+'; -MINUS : '-'; -MULT : '*'; -DIV : '/'; -MOD : '%'; -POW : '^'; +PLUS: '+'; +MINUS: '-'; +MULT: '*'; +DIV: '/'; +MOD: '%'; +POW: '^'; -GE : '>='; -GT : '>'; -LE : '<='; -LT : '<'; -EQ : '=='; -NE : '!='; -PIPE : '|'; -LPAREN : '('; -RPAREN : ')'; -COMMA : ','; -LBRACKET : '['; -RBRACKET : ']'; +GE: '>='; +GT: '>'; +LE: '<='; +LT: '<'; +EQ: '=='; +NE: '!='; +PIPE: '|'; +LPAREN: '('; +RPAREN: ')'; +COMMA: ','; +LBRACKET: '['; +RBRACKET: ']'; -CONSTANT : ('pi'|'PI'|'e'|'E'); -NUMBER : [0-9]+ ('.' [0-9]+)?; -VARIABLE : [a-zA-Z_] [a-zA-Z_0-9]*; -WS : [ \t\r\n]+ -> skip; +CONSTANT: ('pi' | 'PI' | 'e' | 'E'); +NUMBER: [0-9]+ ('.' [0-9]+)?; +VARIABLE: [a-zA-Z_] [a-zA-Z_0-9]*; +WS: [ \t\r\n]+ -> skip; diff --git a/more_math/Parser/MathExpr.interp b/more_math/Parser/MathExpr.interp index 6f6d04e..82a025d 100644 --- a/more_math/Parser/MathExpr.interp +++ b/more_math/Parser/MathExpr.interp @@ -1,10 +1,5 @@ token literal names: null -'(' -')' -'[' -',' -']' 'sin' 'cos' 'tan' @@ -59,6 +54,13 @@ null 'topk' 'botk' 'pinv' +'sum' +'mean' +'std' +'var' +'quartile' +null +'dot' '+' '-' '*' @@ -72,6 +74,11 @@ null '==' '!=' '|' +'(' +')' +',' +'[' +']' null null null @@ -79,11 +86,6 @@ null token symbolic names: null -null -null -null -null -null SIN COS TAN @@ -138,6 +140,13 @@ RANGE TOPK BOTK PINV +SUM +MEAN +STD +VAR +QUARTILE +PERCENTILE +DOT PLUS MINUS MULT @@ -151,6 +160,11 @@ LT EQ NE PIPE +LPAREN +RPAREN +COMMA +LBRACKET +RBRACKET CONSTANT NUMBER VARIABLE @@ -172,4 +186,4 @@ funcN atn: -[4, 1, 76, 479, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 1, 0, 1, 0, 3, 0, 27, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 50, 8, 1, 10, 1, 12, 1, 53, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 64, 8, 2, 10, 2, 12, 2, 67, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 81, 8, 3, 10, 3, 12, 3, 84, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 91, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 98, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 120, 8, 6, 10, 6, 12, 6, 123, 9, 6, 1, 6, 1, 6, 3, 6, 127, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 304, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 355, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 393, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 411, 8, 11, 10, 11, 12, 11, 414, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 423, 8, 11, 10, 11, 12, 11, 426, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 4, 11, 435, 8, 11, 11, 11, 12, 11, 436, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 4, 11, 446, 8, 11, 11, 11, 12, 11, 447, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 4, 11, 457, 8, 11, 11, 11, 12, 11, 458, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 477, 8, 11, 1, 11, 0, 3, 2, 4, 6, 12, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 0, 0, 546, 0, 26, 1, 0, 0, 0, 2, 28, 1, 0, 0, 0, 4, 54, 1, 0, 0, 0, 6, 68, 1, 0, 0, 0, 8, 90, 1, 0, 0, 0, 10, 97, 1, 0, 0, 0, 12, 126, 1, 0, 0, 0, 14, 303, 1, 0, 0, 0, 16, 354, 1, 0, 0, 0, 18, 392, 1, 0, 0, 0, 20, 394, 1, 0, 0, 0, 22, 476, 1, 0, 0, 0, 24, 27, 3, 12, 6, 0, 25, 27, 3, 2, 1, 0, 26, 24, 1, 0, 0, 0, 26, 25, 1, 0, 0, 0, 27, 1, 1, 0, 0, 0, 28, 29, 6, 1, -1, 0, 29, 30, 3, 4, 2, 0, 30, 51, 1, 0, 0, 0, 31, 32, 10, 7, 0, 0, 32, 33, 5, 67, 0, 0, 33, 50, 3, 4, 2, 0, 34, 35, 10, 6, 0, 0, 35, 36, 5, 66, 0, 0, 36, 50, 3, 4, 2, 0, 37, 38, 10, 5, 0, 0, 38, 39, 5, 69, 0, 0, 39, 50, 3, 4, 2, 0, 40, 41, 10, 4, 0, 0, 41, 42, 5, 68, 0, 0, 42, 50, 3, 4, 2, 0, 43, 44, 10, 3, 0, 0, 44, 45, 5, 70, 0, 0, 45, 50, 3, 4, 2, 0, 46, 47, 10, 2, 0, 0, 47, 48, 5, 71, 0, 0, 48, 50, 3, 4, 2, 0, 49, 31, 1, 0, 0, 0, 49, 34, 1, 0, 0, 0, 49, 37, 1, 0, 0, 0, 49, 40, 1, 0, 0, 0, 49, 43, 1, 0, 0, 0, 49, 46, 1, 0, 0, 0, 50, 53, 1, 0, 0, 0, 51, 49, 1, 0, 0, 0, 51, 52, 1, 0, 0, 0, 52, 3, 1, 0, 0, 0, 53, 51, 1, 0, 0, 0, 54, 55, 6, 2, -1, 0, 55, 56, 3, 6, 3, 0, 56, 65, 1, 0, 0, 0, 57, 58, 10, 3, 0, 0, 58, 59, 5, 60, 0, 0, 59, 64, 3, 6, 3, 0, 60, 61, 10, 2, 0, 0, 61, 62, 5, 61, 0, 0, 62, 64, 3, 6, 3, 0, 63, 57, 1, 0, 0, 0, 63, 60, 1, 0, 0, 0, 64, 67, 1, 0, 0, 0, 65, 63, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 5, 1, 0, 0, 0, 67, 65, 1, 0, 0, 0, 68, 69, 6, 3, -1, 0, 69, 70, 3, 8, 4, 0, 70, 82, 1, 0, 0, 0, 71, 72, 10, 4, 0, 0, 72, 73, 5, 62, 0, 0, 73, 81, 3, 8, 4, 0, 74, 75, 10, 3, 0, 0, 75, 76, 5, 63, 0, 0, 76, 81, 3, 8, 4, 0, 77, 78, 10, 2, 0, 0, 78, 79, 5, 64, 0, 0, 79, 81, 3, 8, 4, 0, 80, 71, 1, 0, 0, 0, 80, 74, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 81, 84, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 83, 1, 0, 0, 0, 83, 7, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 85, 86, 3, 10, 5, 0, 86, 87, 5, 65, 0, 0, 87, 88, 3, 8, 4, 0, 88, 91, 1, 0, 0, 0, 89, 91, 3, 10, 5, 0, 90, 85, 1, 0, 0, 0, 90, 89, 1, 0, 0, 0, 91, 9, 1, 0, 0, 0, 92, 93, 5, 60, 0, 0, 93, 98, 3, 10, 5, 0, 94, 95, 5, 61, 0, 0, 95, 98, 3, 10, 5, 0, 96, 98, 3, 12, 6, 0, 97, 92, 1, 0, 0, 0, 97, 94, 1, 0, 0, 0, 97, 96, 1, 0, 0, 0, 98, 11, 1, 0, 0, 0, 99, 127, 3, 14, 7, 0, 100, 127, 3, 16, 8, 0, 101, 127, 3, 18, 9, 0, 102, 127, 3, 20, 10, 0, 103, 127, 3, 22, 11, 0, 104, 127, 5, 75, 0, 0, 105, 127, 5, 74, 0, 0, 106, 127, 5, 73, 0, 0, 107, 108, 5, 1, 0, 0, 108, 109, 3, 0, 0, 0, 109, 110, 5, 2, 0, 0, 110, 127, 1, 0, 0, 0, 111, 112, 5, 72, 0, 0, 112, 113, 3, 0, 0, 0, 113, 114, 5, 72, 0, 0, 114, 127, 1, 0, 0, 0, 115, 116, 5, 3, 0, 0, 116, 121, 3, 0, 0, 0, 117, 118, 5, 4, 0, 0, 118, 120, 3, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 124, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 125, 5, 5, 0, 0, 125, 127, 1, 0, 0, 0, 126, 99, 1, 0, 0, 0, 126, 100, 1, 0, 0, 0, 126, 101, 1, 0, 0, 0, 126, 102, 1, 0, 0, 0, 126, 103, 1, 0, 0, 0, 126, 104, 1, 0, 0, 0, 126, 105, 1, 0, 0, 0, 126, 106, 1, 0, 0, 0, 126, 107, 1, 0, 0, 0, 126, 111, 1, 0, 0, 0, 126, 115, 1, 0, 0, 0, 127, 13, 1, 0, 0, 0, 128, 129, 5, 6, 0, 0, 129, 130, 5, 1, 0, 0, 130, 131, 3, 0, 0, 0, 131, 132, 5, 2, 0, 0, 132, 304, 1, 0, 0, 0, 133, 134, 5, 7, 0, 0, 134, 135, 5, 1, 0, 0, 135, 136, 3, 0, 0, 0, 136, 137, 5, 2, 0, 0, 137, 304, 1, 0, 0, 0, 138, 139, 5, 8, 0, 0, 139, 140, 5, 1, 0, 0, 140, 141, 3, 0, 0, 0, 141, 142, 5, 2, 0, 0, 142, 304, 1, 0, 0, 0, 143, 144, 5, 9, 0, 0, 144, 145, 5, 1, 0, 0, 145, 146, 3, 0, 0, 0, 146, 147, 5, 2, 0, 0, 147, 304, 1, 0, 0, 0, 148, 149, 5, 10, 0, 0, 149, 150, 5, 1, 0, 0, 150, 151, 3, 0, 0, 0, 151, 152, 5, 2, 0, 0, 152, 304, 1, 0, 0, 0, 153, 154, 5, 11, 0, 0, 154, 155, 5, 1, 0, 0, 155, 156, 3, 0, 0, 0, 156, 157, 5, 2, 0, 0, 157, 304, 1, 0, 0, 0, 158, 159, 5, 13, 0, 0, 159, 160, 5, 1, 0, 0, 160, 161, 3, 0, 0, 0, 161, 162, 5, 2, 0, 0, 162, 304, 1, 0, 0, 0, 163, 164, 5, 14, 0, 0, 164, 165, 5, 1, 0, 0, 165, 166, 3, 0, 0, 0, 166, 167, 5, 2, 0, 0, 167, 304, 1, 0, 0, 0, 168, 169, 5, 15, 0, 0, 169, 170, 5, 1, 0, 0, 170, 171, 3, 0, 0, 0, 171, 172, 5, 2, 0, 0, 172, 304, 1, 0, 0, 0, 173, 174, 5, 16, 0, 0, 174, 175, 5, 1, 0, 0, 175, 176, 3, 0, 0, 0, 176, 177, 5, 2, 0, 0, 177, 304, 1, 0, 0, 0, 178, 179, 5, 17, 0, 0, 179, 180, 5, 1, 0, 0, 180, 181, 3, 0, 0, 0, 181, 182, 5, 2, 0, 0, 182, 304, 1, 0, 0, 0, 183, 184, 5, 18, 0, 0, 184, 185, 5, 1, 0, 0, 185, 186, 3, 0, 0, 0, 186, 187, 5, 2, 0, 0, 187, 304, 1, 0, 0, 0, 188, 189, 5, 19, 0, 0, 189, 190, 5, 1, 0, 0, 190, 191, 3, 0, 0, 0, 191, 192, 5, 2, 0, 0, 192, 304, 1, 0, 0, 0, 193, 194, 5, 20, 0, 0, 194, 195, 5, 1, 0, 0, 195, 196, 3, 0, 0, 0, 196, 197, 5, 2, 0, 0, 197, 304, 1, 0, 0, 0, 198, 199, 5, 21, 0, 0, 199, 200, 5, 1, 0, 0, 200, 201, 3, 0, 0, 0, 201, 202, 5, 2, 0, 0, 202, 304, 1, 0, 0, 0, 203, 204, 5, 22, 0, 0, 204, 205, 5, 1, 0, 0, 205, 206, 3, 0, 0, 0, 206, 207, 5, 2, 0, 0, 207, 304, 1, 0, 0, 0, 208, 209, 5, 23, 0, 0, 209, 210, 5, 1, 0, 0, 210, 211, 3, 0, 0, 0, 211, 212, 5, 2, 0, 0, 212, 304, 1, 0, 0, 0, 213, 214, 5, 28, 0, 0, 214, 215, 5, 1, 0, 0, 215, 216, 3, 0, 0, 0, 216, 217, 5, 2, 0, 0, 217, 304, 1, 0, 0, 0, 218, 219, 5, 29, 0, 0, 219, 220, 5, 1, 0, 0, 220, 221, 3, 0, 0, 0, 221, 222, 5, 2, 0, 0, 222, 304, 1, 0, 0, 0, 223, 224, 5, 30, 0, 0, 224, 225, 5, 1, 0, 0, 225, 226, 3, 0, 0, 0, 226, 227, 5, 2, 0, 0, 227, 304, 1, 0, 0, 0, 228, 229, 5, 31, 0, 0, 229, 230, 5, 1, 0, 0, 230, 231, 3, 0, 0, 0, 231, 232, 5, 2, 0, 0, 232, 304, 1, 0, 0, 0, 233, 234, 5, 32, 0, 0, 234, 235, 5, 1, 0, 0, 235, 236, 3, 0, 0, 0, 236, 237, 5, 2, 0, 0, 237, 304, 1, 0, 0, 0, 238, 239, 5, 33, 0, 0, 239, 240, 5, 1, 0, 0, 240, 241, 3, 0, 0, 0, 241, 242, 5, 2, 0, 0, 242, 304, 1, 0, 0, 0, 243, 244, 5, 35, 0, 0, 244, 245, 5, 1, 0, 0, 245, 246, 3, 0, 0, 0, 246, 247, 5, 2, 0, 0, 247, 304, 1, 0, 0, 0, 248, 249, 5, 37, 0, 0, 249, 250, 5, 1, 0, 0, 250, 251, 3, 0, 0, 0, 251, 252, 5, 2, 0, 0, 252, 304, 1, 0, 0, 0, 253, 254, 5, 38, 0, 0, 254, 255, 5, 1, 0, 0, 255, 256, 3, 0, 0, 0, 256, 257, 5, 2, 0, 0, 257, 304, 1, 0, 0, 0, 258, 259, 5, 39, 0, 0, 259, 260, 5, 1, 0, 0, 260, 261, 3, 0, 0, 0, 261, 262, 5, 2, 0, 0, 262, 304, 1, 0, 0, 0, 263, 264, 5, 40, 0, 0, 264, 265, 5, 1, 0, 0, 265, 266, 3, 0, 0, 0, 266, 267, 5, 2, 0, 0, 267, 304, 1, 0, 0, 0, 268, 269, 5, 45, 0, 0, 269, 270, 5, 1, 0, 0, 270, 271, 3, 0, 0, 0, 271, 272, 5, 2, 0, 0, 272, 304, 1, 0, 0, 0, 273, 274, 5, 46, 0, 0, 274, 275, 5, 1, 0, 0, 275, 276, 3, 0, 0, 0, 276, 277, 5, 2, 0, 0, 277, 304, 1, 0, 0, 0, 278, 279, 5, 47, 0, 0, 279, 280, 5, 1, 0, 0, 280, 281, 3, 0, 0, 0, 281, 282, 5, 2, 0, 0, 282, 304, 1, 0, 0, 0, 283, 284, 5, 48, 0, 0, 284, 285, 5, 1, 0, 0, 285, 286, 3, 0, 0, 0, 286, 287, 5, 2, 0, 0, 287, 304, 1, 0, 0, 0, 288, 289, 5, 49, 0, 0, 289, 290, 5, 1, 0, 0, 290, 291, 3, 0, 0, 0, 291, 292, 5, 2, 0, 0, 292, 304, 1, 0, 0, 0, 293, 294, 5, 41, 0, 0, 294, 295, 5, 1, 0, 0, 295, 296, 3, 0, 0, 0, 296, 297, 5, 2, 0, 0, 297, 304, 1, 0, 0, 0, 298, 299, 5, 59, 0, 0, 299, 300, 5, 1, 0, 0, 300, 301, 3, 0, 0, 0, 301, 302, 5, 2, 0, 0, 302, 304, 1, 0, 0, 0, 303, 128, 1, 0, 0, 0, 303, 133, 1, 0, 0, 0, 303, 138, 1, 0, 0, 0, 303, 143, 1, 0, 0, 0, 303, 148, 1, 0, 0, 0, 303, 153, 1, 0, 0, 0, 303, 158, 1, 0, 0, 0, 303, 163, 1, 0, 0, 0, 303, 168, 1, 0, 0, 0, 303, 173, 1, 0, 0, 0, 303, 178, 1, 0, 0, 0, 303, 183, 1, 0, 0, 0, 303, 188, 1, 0, 0, 0, 303, 193, 1, 0, 0, 0, 303, 198, 1, 0, 0, 0, 303, 203, 1, 0, 0, 0, 303, 208, 1, 0, 0, 0, 303, 213, 1, 0, 0, 0, 303, 218, 1, 0, 0, 0, 303, 223, 1, 0, 0, 0, 303, 228, 1, 0, 0, 0, 303, 233, 1, 0, 0, 0, 303, 238, 1, 0, 0, 0, 303, 243, 1, 0, 0, 0, 303, 248, 1, 0, 0, 0, 303, 253, 1, 0, 0, 0, 303, 258, 1, 0, 0, 0, 303, 263, 1, 0, 0, 0, 303, 268, 1, 0, 0, 0, 303, 273, 1, 0, 0, 0, 303, 278, 1, 0, 0, 0, 303, 283, 1, 0, 0, 0, 303, 288, 1, 0, 0, 0, 303, 293, 1, 0, 0, 0, 303, 298, 1, 0, 0, 0, 304, 15, 1, 0, 0, 0, 305, 306, 5, 34, 0, 0, 306, 307, 5, 1, 0, 0, 307, 308, 3, 0, 0, 0, 308, 309, 5, 4, 0, 0, 309, 310, 3, 0, 0, 0, 310, 311, 5, 2, 0, 0, 311, 355, 1, 0, 0, 0, 312, 313, 5, 12, 0, 0, 313, 314, 5, 1, 0, 0, 314, 315, 3, 0, 0, 0, 315, 316, 5, 4, 0, 0, 316, 317, 3, 0, 0, 0, 317, 318, 5, 2, 0, 0, 318, 355, 1, 0, 0, 0, 319, 320, 5, 26, 0, 0, 320, 321, 5, 1, 0, 0, 321, 322, 3, 0, 0, 0, 322, 323, 5, 4, 0, 0, 323, 324, 3, 0, 0, 0, 324, 325, 5, 2, 0, 0, 325, 355, 1, 0, 0, 0, 326, 327, 5, 27, 0, 0, 327, 328, 5, 1, 0, 0, 328, 329, 3, 0, 0, 0, 329, 330, 5, 4, 0, 0, 330, 331, 3, 0, 0, 0, 331, 332, 5, 2, 0, 0, 332, 355, 1, 0, 0, 0, 333, 334, 5, 43, 0, 0, 334, 335, 5, 1, 0, 0, 335, 336, 3, 0, 0, 0, 336, 337, 5, 4, 0, 0, 337, 338, 3, 0, 0, 0, 338, 339, 5, 2, 0, 0, 339, 355, 1, 0, 0, 0, 340, 341, 5, 57, 0, 0, 341, 342, 5, 1, 0, 0, 342, 343, 3, 0, 0, 0, 343, 344, 5, 4, 0, 0, 344, 345, 3, 0, 0, 0, 345, 346, 5, 2, 0, 0, 346, 355, 1, 0, 0, 0, 347, 348, 5, 58, 0, 0, 348, 349, 5, 1, 0, 0, 349, 350, 3, 0, 0, 0, 350, 351, 5, 4, 0, 0, 351, 352, 3, 0, 0, 0, 352, 353, 5, 2, 0, 0, 353, 355, 1, 0, 0, 0, 354, 305, 1, 0, 0, 0, 354, 312, 1, 0, 0, 0, 354, 319, 1, 0, 0, 0, 354, 326, 1, 0, 0, 0, 354, 333, 1, 0, 0, 0, 354, 340, 1, 0, 0, 0, 354, 347, 1, 0, 0, 0, 355, 17, 1, 0, 0, 0, 356, 357, 5, 36, 0, 0, 357, 358, 5, 1, 0, 0, 358, 359, 3, 0, 0, 0, 359, 360, 5, 4, 0, 0, 360, 361, 3, 0, 0, 0, 361, 362, 5, 4, 0, 0, 362, 363, 3, 0, 0, 0, 363, 364, 5, 2, 0, 0, 364, 393, 1, 0, 0, 0, 365, 366, 5, 42, 0, 0, 366, 367, 5, 1, 0, 0, 367, 368, 3, 0, 0, 0, 368, 369, 5, 4, 0, 0, 369, 370, 3, 0, 0, 0, 370, 371, 5, 4, 0, 0, 371, 372, 3, 0, 0, 0, 372, 373, 5, 2, 0, 0, 373, 393, 1, 0, 0, 0, 374, 375, 5, 44, 0, 0, 375, 376, 5, 1, 0, 0, 376, 377, 3, 0, 0, 0, 377, 378, 5, 4, 0, 0, 378, 379, 3, 0, 0, 0, 379, 380, 5, 4, 0, 0, 380, 381, 3, 0, 0, 0, 381, 382, 5, 2, 0, 0, 382, 393, 1, 0, 0, 0, 383, 384, 5, 56, 0, 0, 384, 385, 5, 1, 0, 0, 385, 386, 3, 0, 0, 0, 386, 387, 5, 4, 0, 0, 387, 388, 3, 0, 0, 0, 388, 389, 5, 4, 0, 0, 389, 390, 3, 0, 0, 0, 390, 391, 5, 2, 0, 0, 391, 393, 1, 0, 0, 0, 392, 356, 1, 0, 0, 0, 392, 365, 1, 0, 0, 0, 392, 374, 1, 0, 0, 0, 392, 383, 1, 0, 0, 0, 393, 19, 1, 0, 0, 0, 394, 395, 5, 53, 0, 0, 395, 396, 5, 1, 0, 0, 396, 397, 3, 0, 0, 0, 397, 398, 5, 4, 0, 0, 398, 399, 3, 0, 0, 0, 399, 400, 5, 4, 0, 0, 400, 401, 3, 0, 0, 0, 401, 402, 5, 4, 0, 0, 402, 403, 3, 0, 0, 0, 403, 404, 5, 2, 0, 0, 404, 21, 1, 0, 0, 0, 405, 406, 5, 24, 0, 0, 406, 407, 5, 1, 0, 0, 407, 412, 3, 0, 0, 0, 408, 409, 5, 4, 0, 0, 409, 411, 3, 0, 0, 0, 410, 408, 1, 0, 0, 0, 411, 414, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 415, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 415, 416, 5, 2, 0, 0, 416, 477, 1, 0, 0, 0, 417, 418, 5, 25, 0, 0, 418, 419, 5, 1, 0, 0, 419, 424, 3, 0, 0, 0, 420, 421, 5, 4, 0, 0, 421, 423, 3, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 426, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 427, 1, 0, 0, 0, 426, 424, 1, 0, 0, 0, 427, 428, 5, 2, 0, 0, 428, 477, 1, 0, 0, 0, 429, 430, 5, 50, 0, 0, 430, 431, 5, 1, 0, 0, 431, 434, 3, 0, 0, 0, 432, 433, 5, 4, 0, 0, 433, 435, 3, 0, 0, 0, 434, 432, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 2, 0, 0, 439, 477, 1, 0, 0, 0, 440, 441, 5, 51, 0, 0, 441, 442, 5, 1, 0, 0, 442, 445, 3, 0, 0, 0, 443, 444, 5, 4, 0, 0, 444, 446, 3, 0, 0, 0, 445, 443, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 445, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 5, 2, 0, 0, 450, 477, 1, 0, 0, 0, 451, 452, 5, 52, 0, 0, 452, 453, 5, 1, 0, 0, 453, 456, 3, 0, 0, 0, 454, 455, 5, 4, 0, 0, 455, 457, 3, 0, 0, 0, 456, 454, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 5, 2, 0, 0, 461, 477, 1, 0, 0, 0, 462, 463, 5, 54, 0, 0, 463, 464, 5, 1, 0, 0, 464, 465, 3, 0, 0, 0, 465, 466, 5, 4, 0, 0, 466, 467, 3, 0, 0, 0, 467, 468, 5, 2, 0, 0, 468, 477, 1, 0, 0, 0, 469, 470, 5, 55, 0, 0, 470, 471, 5, 1, 0, 0, 471, 472, 3, 0, 0, 0, 472, 473, 5, 4, 0, 0, 473, 474, 3, 0, 0, 0, 474, 475, 5, 2, 0, 0, 475, 477, 1, 0, 0, 0, 476, 405, 1, 0, 0, 0, 476, 417, 1, 0, 0, 0, 476, 429, 1, 0, 0, 0, 476, 440, 1, 0, 0, 0, 476, 451, 1, 0, 0, 0, 476, 462, 1, 0, 0, 0, 476, 469, 1, 0, 0, 0, 477, 23, 1, 0, 0, 0, 20, 26, 49, 51, 63, 65, 80, 82, 90, 97, 121, 126, 303, 354, 392, 412, 424, 436, 447, 458, 476] \ No newline at end of file +[4, 1, 83, 520, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 1, 0, 1, 0, 3, 0, 27, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 50, 8, 1, 10, 1, 12, 1, 53, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 64, 8, 2, 10, 2, 12, 2, 67, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 81, 8, 3, 10, 3, 12, 3, 84, 9, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 91, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 98, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 120, 8, 6, 10, 6, 12, 6, 123, 9, 6, 1, 6, 1, 6, 3, 6, 127, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 324, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 396, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 434, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 452, 8, 11, 10, 11, 12, 11, 455, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 464, 8, 11, 10, 11, 12, 11, 467, 9, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 4, 11, 476, 8, 11, 11, 11, 12, 11, 477, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 4, 11, 487, 8, 11, 11, 11, 12, 11, 488, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 4, 11, 498, 8, 11, 11, 11, 12, 11, 499, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 518, 8, 11, 1, 11, 0, 3, 2, 4, 6, 12, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 0, 0, 594, 0, 26, 1, 0, 0, 0, 2, 28, 1, 0, 0, 0, 4, 54, 1, 0, 0, 0, 6, 68, 1, 0, 0, 0, 8, 90, 1, 0, 0, 0, 10, 97, 1, 0, 0, 0, 12, 126, 1, 0, 0, 0, 14, 323, 1, 0, 0, 0, 16, 395, 1, 0, 0, 0, 18, 433, 1, 0, 0, 0, 20, 435, 1, 0, 0, 0, 22, 517, 1, 0, 0, 0, 24, 27, 3, 12, 6, 0, 25, 27, 3, 2, 1, 0, 26, 24, 1, 0, 0, 0, 26, 25, 1, 0, 0, 0, 27, 1, 1, 0, 0, 0, 28, 29, 6, 1, -1, 0, 29, 30, 3, 4, 2, 0, 30, 51, 1, 0, 0, 0, 31, 32, 10, 7, 0, 0, 32, 33, 5, 69, 0, 0, 33, 50, 3, 4, 2, 0, 34, 35, 10, 6, 0, 0, 35, 36, 5, 68, 0, 0, 36, 50, 3, 4, 2, 0, 37, 38, 10, 5, 0, 0, 38, 39, 5, 71, 0, 0, 39, 50, 3, 4, 2, 0, 40, 41, 10, 4, 0, 0, 41, 42, 5, 70, 0, 0, 42, 50, 3, 4, 2, 0, 43, 44, 10, 3, 0, 0, 44, 45, 5, 72, 0, 0, 45, 50, 3, 4, 2, 0, 46, 47, 10, 2, 0, 0, 47, 48, 5, 73, 0, 0, 48, 50, 3, 4, 2, 0, 49, 31, 1, 0, 0, 0, 49, 34, 1, 0, 0, 0, 49, 37, 1, 0, 0, 0, 49, 40, 1, 0, 0, 0, 49, 43, 1, 0, 0, 0, 49, 46, 1, 0, 0, 0, 50, 53, 1, 0, 0, 0, 51, 49, 1, 0, 0, 0, 51, 52, 1, 0, 0, 0, 52, 3, 1, 0, 0, 0, 53, 51, 1, 0, 0, 0, 54, 55, 6, 2, -1, 0, 55, 56, 3, 6, 3, 0, 56, 65, 1, 0, 0, 0, 57, 58, 10, 3, 0, 0, 58, 59, 5, 62, 0, 0, 59, 64, 3, 6, 3, 0, 60, 61, 10, 2, 0, 0, 61, 62, 5, 63, 0, 0, 62, 64, 3, 6, 3, 0, 63, 57, 1, 0, 0, 0, 63, 60, 1, 0, 0, 0, 64, 67, 1, 0, 0, 0, 65, 63, 1, 0, 0, 0, 65, 66, 1, 0, 0, 0, 66, 5, 1, 0, 0, 0, 67, 65, 1, 0, 0, 0, 68, 69, 6, 3, -1, 0, 69, 70, 3, 8, 4, 0, 70, 82, 1, 0, 0, 0, 71, 72, 10, 4, 0, 0, 72, 73, 5, 64, 0, 0, 73, 81, 3, 8, 4, 0, 74, 75, 10, 3, 0, 0, 75, 76, 5, 65, 0, 0, 76, 81, 3, 8, 4, 0, 77, 78, 10, 2, 0, 0, 78, 79, 5, 66, 0, 0, 79, 81, 3, 8, 4, 0, 80, 71, 1, 0, 0, 0, 80, 74, 1, 0, 0, 0, 80, 77, 1, 0, 0, 0, 81, 84, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 83, 1, 0, 0, 0, 83, 7, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 85, 86, 3, 10, 5, 0, 86, 87, 5, 67, 0, 0, 87, 88, 3, 8, 4, 0, 88, 91, 1, 0, 0, 0, 89, 91, 3, 10, 5, 0, 90, 85, 1, 0, 0, 0, 90, 89, 1, 0, 0, 0, 91, 9, 1, 0, 0, 0, 92, 93, 5, 62, 0, 0, 93, 98, 3, 10, 5, 0, 94, 95, 5, 63, 0, 0, 95, 98, 3, 10, 5, 0, 96, 98, 3, 12, 6, 0, 97, 92, 1, 0, 0, 0, 97, 94, 1, 0, 0, 0, 97, 96, 1, 0, 0, 0, 98, 11, 1, 0, 0, 0, 99, 127, 3, 14, 7, 0, 100, 127, 3, 16, 8, 0, 101, 127, 3, 18, 9, 0, 102, 127, 3, 20, 10, 0, 103, 127, 3, 22, 11, 0, 104, 127, 5, 82, 0, 0, 105, 127, 5, 81, 0, 0, 106, 127, 5, 80, 0, 0, 107, 108, 5, 75, 0, 0, 108, 109, 3, 0, 0, 0, 109, 110, 5, 76, 0, 0, 110, 127, 1, 0, 0, 0, 111, 112, 5, 74, 0, 0, 112, 113, 3, 0, 0, 0, 113, 114, 5, 74, 0, 0, 114, 127, 1, 0, 0, 0, 115, 116, 5, 78, 0, 0, 116, 121, 3, 0, 0, 0, 117, 118, 5, 77, 0, 0, 118, 120, 3, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 124, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 125, 5, 79, 0, 0, 125, 127, 1, 0, 0, 0, 126, 99, 1, 0, 0, 0, 126, 100, 1, 0, 0, 0, 126, 101, 1, 0, 0, 0, 126, 102, 1, 0, 0, 0, 126, 103, 1, 0, 0, 0, 126, 104, 1, 0, 0, 0, 126, 105, 1, 0, 0, 0, 126, 106, 1, 0, 0, 0, 126, 107, 1, 0, 0, 0, 126, 111, 1, 0, 0, 0, 126, 115, 1, 0, 0, 0, 127, 13, 1, 0, 0, 0, 128, 129, 5, 1, 0, 0, 129, 130, 5, 75, 0, 0, 130, 131, 3, 0, 0, 0, 131, 132, 5, 76, 0, 0, 132, 324, 1, 0, 0, 0, 133, 134, 5, 2, 0, 0, 134, 135, 5, 75, 0, 0, 135, 136, 3, 0, 0, 0, 136, 137, 5, 76, 0, 0, 137, 324, 1, 0, 0, 0, 138, 139, 5, 3, 0, 0, 139, 140, 5, 75, 0, 0, 140, 141, 3, 0, 0, 0, 141, 142, 5, 76, 0, 0, 142, 324, 1, 0, 0, 0, 143, 144, 5, 4, 0, 0, 144, 145, 5, 75, 0, 0, 145, 146, 3, 0, 0, 0, 146, 147, 5, 76, 0, 0, 147, 324, 1, 0, 0, 0, 148, 149, 5, 5, 0, 0, 149, 150, 5, 75, 0, 0, 150, 151, 3, 0, 0, 0, 151, 152, 5, 76, 0, 0, 152, 324, 1, 0, 0, 0, 153, 154, 5, 6, 0, 0, 154, 155, 5, 75, 0, 0, 155, 156, 3, 0, 0, 0, 156, 157, 5, 76, 0, 0, 157, 324, 1, 0, 0, 0, 158, 159, 5, 8, 0, 0, 159, 160, 5, 75, 0, 0, 160, 161, 3, 0, 0, 0, 161, 162, 5, 76, 0, 0, 162, 324, 1, 0, 0, 0, 163, 164, 5, 9, 0, 0, 164, 165, 5, 75, 0, 0, 165, 166, 3, 0, 0, 0, 166, 167, 5, 76, 0, 0, 167, 324, 1, 0, 0, 0, 168, 169, 5, 10, 0, 0, 169, 170, 5, 75, 0, 0, 170, 171, 3, 0, 0, 0, 171, 172, 5, 76, 0, 0, 172, 324, 1, 0, 0, 0, 173, 174, 5, 11, 0, 0, 174, 175, 5, 75, 0, 0, 175, 176, 3, 0, 0, 0, 176, 177, 5, 76, 0, 0, 177, 324, 1, 0, 0, 0, 178, 179, 5, 12, 0, 0, 179, 180, 5, 75, 0, 0, 180, 181, 3, 0, 0, 0, 181, 182, 5, 76, 0, 0, 182, 324, 1, 0, 0, 0, 183, 184, 5, 13, 0, 0, 184, 185, 5, 75, 0, 0, 185, 186, 3, 0, 0, 0, 186, 187, 5, 76, 0, 0, 187, 324, 1, 0, 0, 0, 188, 189, 5, 14, 0, 0, 189, 190, 5, 75, 0, 0, 190, 191, 3, 0, 0, 0, 191, 192, 5, 76, 0, 0, 192, 324, 1, 0, 0, 0, 193, 194, 5, 15, 0, 0, 194, 195, 5, 75, 0, 0, 195, 196, 3, 0, 0, 0, 196, 197, 5, 76, 0, 0, 197, 324, 1, 0, 0, 0, 198, 199, 5, 16, 0, 0, 199, 200, 5, 75, 0, 0, 200, 201, 3, 0, 0, 0, 201, 202, 5, 76, 0, 0, 202, 324, 1, 0, 0, 0, 203, 204, 5, 17, 0, 0, 204, 205, 5, 75, 0, 0, 205, 206, 3, 0, 0, 0, 206, 207, 5, 76, 0, 0, 207, 324, 1, 0, 0, 0, 208, 209, 5, 18, 0, 0, 209, 210, 5, 75, 0, 0, 210, 211, 3, 0, 0, 0, 211, 212, 5, 76, 0, 0, 212, 324, 1, 0, 0, 0, 213, 214, 5, 23, 0, 0, 214, 215, 5, 75, 0, 0, 215, 216, 3, 0, 0, 0, 216, 217, 5, 76, 0, 0, 217, 324, 1, 0, 0, 0, 218, 219, 5, 24, 0, 0, 219, 220, 5, 75, 0, 0, 220, 221, 3, 0, 0, 0, 221, 222, 5, 76, 0, 0, 222, 324, 1, 0, 0, 0, 223, 224, 5, 25, 0, 0, 224, 225, 5, 75, 0, 0, 225, 226, 3, 0, 0, 0, 226, 227, 5, 76, 0, 0, 227, 324, 1, 0, 0, 0, 228, 229, 5, 26, 0, 0, 229, 230, 5, 75, 0, 0, 230, 231, 3, 0, 0, 0, 231, 232, 5, 76, 0, 0, 232, 324, 1, 0, 0, 0, 233, 234, 5, 27, 0, 0, 234, 235, 5, 75, 0, 0, 235, 236, 3, 0, 0, 0, 236, 237, 5, 76, 0, 0, 237, 324, 1, 0, 0, 0, 238, 239, 5, 28, 0, 0, 239, 240, 5, 75, 0, 0, 240, 241, 3, 0, 0, 0, 241, 242, 5, 76, 0, 0, 242, 324, 1, 0, 0, 0, 243, 244, 5, 30, 0, 0, 244, 245, 5, 75, 0, 0, 245, 246, 3, 0, 0, 0, 246, 247, 5, 76, 0, 0, 247, 324, 1, 0, 0, 0, 248, 249, 5, 32, 0, 0, 249, 250, 5, 75, 0, 0, 250, 251, 3, 0, 0, 0, 251, 252, 5, 76, 0, 0, 252, 324, 1, 0, 0, 0, 253, 254, 5, 33, 0, 0, 254, 255, 5, 75, 0, 0, 255, 256, 3, 0, 0, 0, 256, 257, 5, 76, 0, 0, 257, 324, 1, 0, 0, 0, 258, 259, 5, 34, 0, 0, 259, 260, 5, 75, 0, 0, 260, 261, 3, 0, 0, 0, 261, 262, 5, 76, 0, 0, 262, 324, 1, 0, 0, 0, 263, 264, 5, 35, 0, 0, 264, 265, 5, 75, 0, 0, 265, 266, 3, 0, 0, 0, 266, 267, 5, 76, 0, 0, 267, 324, 1, 0, 0, 0, 268, 269, 5, 40, 0, 0, 269, 270, 5, 75, 0, 0, 270, 271, 3, 0, 0, 0, 271, 272, 5, 76, 0, 0, 272, 324, 1, 0, 0, 0, 273, 274, 5, 41, 0, 0, 274, 275, 5, 75, 0, 0, 275, 276, 3, 0, 0, 0, 276, 277, 5, 76, 0, 0, 277, 324, 1, 0, 0, 0, 278, 279, 5, 42, 0, 0, 279, 280, 5, 75, 0, 0, 280, 281, 3, 0, 0, 0, 281, 282, 5, 76, 0, 0, 282, 324, 1, 0, 0, 0, 283, 284, 5, 43, 0, 0, 284, 285, 5, 75, 0, 0, 285, 286, 3, 0, 0, 0, 286, 287, 5, 76, 0, 0, 287, 324, 1, 0, 0, 0, 288, 289, 5, 44, 0, 0, 289, 290, 5, 75, 0, 0, 290, 291, 3, 0, 0, 0, 291, 292, 5, 76, 0, 0, 292, 324, 1, 0, 0, 0, 293, 294, 5, 36, 0, 0, 294, 295, 5, 75, 0, 0, 295, 296, 3, 0, 0, 0, 296, 297, 5, 76, 0, 0, 297, 324, 1, 0, 0, 0, 298, 299, 5, 54, 0, 0, 299, 300, 5, 75, 0, 0, 300, 301, 3, 0, 0, 0, 301, 302, 5, 76, 0, 0, 302, 324, 1, 0, 0, 0, 303, 304, 5, 55, 0, 0, 304, 305, 5, 75, 0, 0, 305, 306, 3, 0, 0, 0, 306, 307, 5, 76, 0, 0, 307, 324, 1, 0, 0, 0, 308, 309, 5, 56, 0, 0, 309, 310, 5, 75, 0, 0, 310, 311, 3, 0, 0, 0, 311, 312, 5, 76, 0, 0, 312, 324, 1, 0, 0, 0, 313, 314, 5, 57, 0, 0, 314, 315, 5, 75, 0, 0, 315, 316, 3, 0, 0, 0, 316, 317, 5, 76, 0, 0, 317, 324, 1, 0, 0, 0, 318, 319, 5, 58, 0, 0, 319, 320, 5, 75, 0, 0, 320, 321, 3, 0, 0, 0, 321, 322, 5, 76, 0, 0, 322, 324, 1, 0, 0, 0, 323, 128, 1, 0, 0, 0, 323, 133, 1, 0, 0, 0, 323, 138, 1, 0, 0, 0, 323, 143, 1, 0, 0, 0, 323, 148, 1, 0, 0, 0, 323, 153, 1, 0, 0, 0, 323, 158, 1, 0, 0, 0, 323, 163, 1, 0, 0, 0, 323, 168, 1, 0, 0, 0, 323, 173, 1, 0, 0, 0, 323, 178, 1, 0, 0, 0, 323, 183, 1, 0, 0, 0, 323, 188, 1, 0, 0, 0, 323, 193, 1, 0, 0, 0, 323, 198, 1, 0, 0, 0, 323, 203, 1, 0, 0, 0, 323, 208, 1, 0, 0, 0, 323, 213, 1, 0, 0, 0, 323, 218, 1, 0, 0, 0, 323, 223, 1, 0, 0, 0, 323, 228, 1, 0, 0, 0, 323, 233, 1, 0, 0, 0, 323, 238, 1, 0, 0, 0, 323, 243, 1, 0, 0, 0, 323, 248, 1, 0, 0, 0, 323, 253, 1, 0, 0, 0, 323, 258, 1, 0, 0, 0, 323, 263, 1, 0, 0, 0, 323, 268, 1, 0, 0, 0, 323, 273, 1, 0, 0, 0, 323, 278, 1, 0, 0, 0, 323, 283, 1, 0, 0, 0, 323, 288, 1, 0, 0, 0, 323, 293, 1, 0, 0, 0, 323, 298, 1, 0, 0, 0, 323, 303, 1, 0, 0, 0, 323, 308, 1, 0, 0, 0, 323, 313, 1, 0, 0, 0, 323, 318, 1, 0, 0, 0, 324, 15, 1, 0, 0, 0, 325, 326, 5, 29, 0, 0, 326, 327, 5, 75, 0, 0, 327, 328, 3, 0, 0, 0, 328, 329, 5, 77, 0, 0, 329, 330, 3, 0, 0, 0, 330, 331, 5, 76, 0, 0, 331, 396, 1, 0, 0, 0, 332, 333, 5, 7, 0, 0, 333, 334, 5, 75, 0, 0, 334, 335, 3, 0, 0, 0, 335, 336, 5, 77, 0, 0, 336, 337, 3, 0, 0, 0, 337, 338, 5, 76, 0, 0, 338, 396, 1, 0, 0, 0, 339, 340, 5, 21, 0, 0, 340, 341, 5, 75, 0, 0, 341, 342, 3, 0, 0, 0, 342, 343, 5, 77, 0, 0, 343, 344, 3, 0, 0, 0, 344, 345, 5, 76, 0, 0, 345, 396, 1, 0, 0, 0, 346, 347, 5, 22, 0, 0, 347, 348, 5, 75, 0, 0, 348, 349, 3, 0, 0, 0, 349, 350, 5, 77, 0, 0, 350, 351, 3, 0, 0, 0, 351, 352, 5, 76, 0, 0, 352, 396, 1, 0, 0, 0, 353, 354, 5, 38, 0, 0, 354, 355, 5, 75, 0, 0, 355, 356, 3, 0, 0, 0, 356, 357, 5, 77, 0, 0, 357, 358, 3, 0, 0, 0, 358, 359, 5, 76, 0, 0, 359, 396, 1, 0, 0, 0, 360, 361, 5, 52, 0, 0, 361, 362, 5, 75, 0, 0, 362, 363, 3, 0, 0, 0, 363, 364, 5, 77, 0, 0, 364, 365, 3, 0, 0, 0, 365, 366, 5, 76, 0, 0, 366, 396, 1, 0, 0, 0, 367, 368, 5, 53, 0, 0, 368, 369, 5, 75, 0, 0, 369, 370, 3, 0, 0, 0, 370, 371, 5, 77, 0, 0, 371, 372, 3, 0, 0, 0, 372, 373, 5, 76, 0, 0, 373, 396, 1, 0, 0, 0, 374, 375, 5, 59, 0, 0, 375, 376, 5, 75, 0, 0, 376, 377, 3, 0, 0, 0, 377, 378, 5, 77, 0, 0, 378, 379, 3, 0, 0, 0, 379, 380, 5, 76, 0, 0, 380, 396, 1, 0, 0, 0, 381, 382, 5, 60, 0, 0, 382, 383, 5, 75, 0, 0, 383, 384, 3, 0, 0, 0, 384, 385, 5, 77, 0, 0, 385, 386, 3, 0, 0, 0, 386, 387, 5, 76, 0, 0, 387, 396, 1, 0, 0, 0, 388, 389, 5, 61, 0, 0, 389, 390, 5, 75, 0, 0, 390, 391, 3, 0, 0, 0, 391, 392, 5, 77, 0, 0, 392, 393, 3, 0, 0, 0, 393, 394, 5, 76, 0, 0, 394, 396, 1, 0, 0, 0, 395, 325, 1, 0, 0, 0, 395, 332, 1, 0, 0, 0, 395, 339, 1, 0, 0, 0, 395, 346, 1, 0, 0, 0, 395, 353, 1, 0, 0, 0, 395, 360, 1, 0, 0, 0, 395, 367, 1, 0, 0, 0, 395, 374, 1, 0, 0, 0, 395, 381, 1, 0, 0, 0, 395, 388, 1, 0, 0, 0, 396, 17, 1, 0, 0, 0, 397, 398, 5, 31, 0, 0, 398, 399, 5, 75, 0, 0, 399, 400, 3, 0, 0, 0, 400, 401, 5, 77, 0, 0, 401, 402, 3, 0, 0, 0, 402, 403, 5, 77, 0, 0, 403, 404, 3, 0, 0, 0, 404, 405, 5, 76, 0, 0, 405, 434, 1, 0, 0, 0, 406, 407, 5, 37, 0, 0, 407, 408, 5, 75, 0, 0, 408, 409, 3, 0, 0, 0, 409, 410, 5, 77, 0, 0, 410, 411, 3, 0, 0, 0, 411, 412, 5, 77, 0, 0, 412, 413, 3, 0, 0, 0, 413, 414, 5, 76, 0, 0, 414, 434, 1, 0, 0, 0, 415, 416, 5, 39, 0, 0, 416, 417, 5, 75, 0, 0, 417, 418, 3, 0, 0, 0, 418, 419, 5, 77, 0, 0, 419, 420, 3, 0, 0, 0, 420, 421, 5, 77, 0, 0, 421, 422, 3, 0, 0, 0, 422, 423, 5, 76, 0, 0, 423, 434, 1, 0, 0, 0, 424, 425, 5, 51, 0, 0, 425, 426, 5, 75, 0, 0, 426, 427, 3, 0, 0, 0, 427, 428, 5, 77, 0, 0, 428, 429, 3, 0, 0, 0, 429, 430, 5, 77, 0, 0, 430, 431, 3, 0, 0, 0, 431, 432, 5, 76, 0, 0, 432, 434, 1, 0, 0, 0, 433, 397, 1, 0, 0, 0, 433, 406, 1, 0, 0, 0, 433, 415, 1, 0, 0, 0, 433, 424, 1, 0, 0, 0, 434, 19, 1, 0, 0, 0, 435, 436, 5, 48, 0, 0, 436, 437, 5, 75, 0, 0, 437, 438, 3, 0, 0, 0, 438, 439, 5, 77, 0, 0, 439, 440, 3, 0, 0, 0, 440, 441, 5, 77, 0, 0, 441, 442, 3, 0, 0, 0, 442, 443, 5, 77, 0, 0, 443, 444, 3, 0, 0, 0, 444, 445, 5, 76, 0, 0, 445, 21, 1, 0, 0, 0, 446, 447, 5, 19, 0, 0, 447, 448, 5, 75, 0, 0, 448, 453, 3, 0, 0, 0, 449, 450, 5, 77, 0, 0, 450, 452, 3, 0, 0, 0, 451, 449, 1, 0, 0, 0, 452, 455, 1, 0, 0, 0, 453, 451, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 456, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 456, 457, 5, 76, 0, 0, 457, 518, 1, 0, 0, 0, 458, 459, 5, 20, 0, 0, 459, 460, 5, 75, 0, 0, 460, 465, 3, 0, 0, 0, 461, 462, 5, 77, 0, 0, 462, 464, 3, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 467, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 468, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 468, 469, 5, 76, 0, 0, 469, 518, 1, 0, 0, 0, 470, 471, 5, 45, 0, 0, 471, 472, 5, 75, 0, 0, 472, 475, 3, 0, 0, 0, 473, 474, 5, 77, 0, 0, 474, 476, 3, 0, 0, 0, 475, 473, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 480, 5, 76, 0, 0, 480, 518, 1, 0, 0, 0, 481, 482, 5, 46, 0, 0, 482, 483, 5, 75, 0, 0, 483, 486, 3, 0, 0, 0, 484, 485, 5, 77, 0, 0, 485, 487, 3, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 5, 76, 0, 0, 491, 518, 1, 0, 0, 0, 492, 493, 5, 47, 0, 0, 493, 494, 5, 75, 0, 0, 494, 497, 3, 0, 0, 0, 495, 496, 5, 77, 0, 0, 496, 498, 3, 0, 0, 0, 497, 495, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 5, 76, 0, 0, 502, 518, 1, 0, 0, 0, 503, 504, 5, 49, 0, 0, 504, 505, 5, 75, 0, 0, 505, 506, 3, 0, 0, 0, 506, 507, 5, 77, 0, 0, 507, 508, 3, 0, 0, 0, 508, 509, 5, 76, 0, 0, 509, 518, 1, 0, 0, 0, 510, 511, 5, 50, 0, 0, 511, 512, 5, 75, 0, 0, 512, 513, 3, 0, 0, 0, 513, 514, 5, 77, 0, 0, 514, 515, 3, 0, 0, 0, 515, 516, 5, 76, 0, 0, 516, 518, 1, 0, 0, 0, 517, 446, 1, 0, 0, 0, 517, 458, 1, 0, 0, 0, 517, 470, 1, 0, 0, 0, 517, 481, 1, 0, 0, 0, 517, 492, 1, 0, 0, 0, 517, 503, 1, 0, 0, 0, 517, 510, 1, 0, 0, 0, 518, 23, 1, 0, 0, 0, 20, 26, 49, 51, 63, 65, 80, 82, 90, 97, 121, 126, 323, 395, 433, 453, 465, 477, 488, 499, 517] \ No newline at end of file diff --git a/more_math/Parser/MathExpr.tokens b/more_math/Parser/MathExpr.tokens index ad02869..77e6f06 100644 --- a/more_math/Parser/MathExpr.tokens +++ b/more_math/Parser/MathExpr.tokens @@ -1,143 +1,156 @@ -T__0=1 -T__1=2 -T__2=3 -T__3=4 -T__4=5 -SIN=6 -COS=7 -TAN=8 -ASIN=9 -ACOS=10 -ATAN=11 -ATAN2=12 -SINH=13 -COSH=14 -TANH=15 -ASINH=16 -ACOSH=17 -ATANH=18 -ABS=19 -SQRT=20 -LN=21 -LOG=22 -EXP=23 -SMIN=24 -SMAX=25 -TMIN=26 -TMAX=27 -TNORM=28 -SNORM=29 -FLOOR=30 -CEIL=31 -ROUND=32 -GAMMA=33 -POWE=34 -SIGM=35 -CLAMP=36 -SFFT=37 -SIFFT=38 -ANGL=39 -PRNT=40 -PRINT_SHAPE=41 -LERP=42 -STEP=43 -SMOOTHSTEP=44 -FRACT=45 -RELU=46 -SOFTPLUS=47 -GELU=48 -SIGN=49 -MAP=50 -EZCONV=51 -CONV=52 -SWAP=53 -PERM=54 -RESHAPE=55 -RANGE=56 -TOPK=57 -BOTK=58 -PINV=59 -PLUS=60 -MINUS=61 -MULT=62 -DIV=63 -MOD=64 -POW=65 -GE=66 -GT=67 -LE=68 -LT=69 -EQ=70 -NE=71 -PIPE=72 -CONSTANT=73 -NUMBER=74 -VARIABLE=75 -WS=76 -'('=1 -')'=2 -'['=3 -','=4 -']'=5 -'sin'=6 -'cos'=7 -'tan'=8 -'asin'=9 -'acos'=10 -'atan'=11 -'atan2'=12 -'sinh'=13 -'cosh'=14 -'tanh'=15 -'asinh'=16 -'acosh'=17 -'atanh'=18 -'abs'=19 -'sqrt'=20 -'ln'=21 -'log'=22 -'exp'=23 -'smin'=24 -'smax'=25 -'tmin'=26 -'tmax'=27 -'tnorm'=28 -'snorm'=29 -'floor'=30 -'ceil'=31 -'round'=32 -'gamma'=33 -'pow'=34 -'sigm'=35 -'clamp'=36 -'fft'=37 -'ifft'=38 -'angle'=39 -'print'=40 -'lerp'=42 -'step'=43 -'smoothstep'=44 -'fract'=45 -'relu'=46 -'softplus'=47 -'gelu'=48 -'sign'=49 -'map'=50 -'swap'=53 -'range'=56 -'topk'=57 -'botk'=58 -'pinv'=59 -'+'=60 -'-'=61 -'*'=62 -'/'=63 -'%'=64 -'^'=65 -'>='=66 -'>'=67 -'<='=68 -'<'=69 -'=='=70 -'!='=71 -'|'=72 +SIN=1 +COS=2 +TAN=3 +ASIN=4 +ACOS=5 +ATAN=6 +ATAN2=7 +SINH=8 +COSH=9 +TANH=10 +ASINH=11 +ACOSH=12 +ATANH=13 +ABS=14 +SQRT=15 +LN=16 +LOG=17 +EXP=18 +SMIN=19 +SMAX=20 +TMIN=21 +TMAX=22 +TNORM=23 +SNORM=24 +FLOOR=25 +CEIL=26 +ROUND=27 +GAMMA=28 +POWE=29 +SIGM=30 +CLAMP=31 +SFFT=32 +SIFFT=33 +ANGL=34 +PRNT=35 +PRINT_SHAPE=36 +LERP=37 +STEP=38 +SMOOTHSTEP=39 +FRACT=40 +RELU=41 +SOFTPLUS=42 +GELU=43 +SIGN=44 +MAP=45 +EZCONV=46 +CONV=47 +SWAP=48 +PERM=49 +RESHAPE=50 +RANGE=51 +TOPK=52 +BOTK=53 +PINV=54 +SUM=55 +MEAN=56 +STD=57 +VAR=58 +QUARTILE=59 +PERCENTILE=60 +DOT=61 +PLUS=62 +MINUS=63 +MULT=64 +DIV=65 +MOD=66 +POW=67 +GE=68 +GT=69 +LE=70 +LT=71 +EQ=72 +NE=73 +PIPE=74 +LPAREN=75 +RPAREN=76 +COMMA=77 +LBRACKET=78 +RBRACKET=79 +CONSTANT=80 +NUMBER=81 +VARIABLE=82 +WS=83 +'sin'=1 +'cos'=2 +'tan'=3 +'asin'=4 +'acos'=5 +'atan'=6 +'atan2'=7 +'sinh'=8 +'cosh'=9 +'tanh'=10 +'asinh'=11 +'acosh'=12 +'atanh'=13 +'abs'=14 +'sqrt'=15 +'ln'=16 +'log'=17 +'exp'=18 +'smin'=19 +'smax'=20 +'tmin'=21 +'tmax'=22 +'tnorm'=23 +'snorm'=24 +'floor'=25 +'ceil'=26 +'round'=27 +'gamma'=28 +'pow'=29 +'sigm'=30 +'clamp'=31 +'fft'=32 +'ifft'=33 +'angle'=34 +'print'=35 +'lerp'=37 +'step'=38 +'smoothstep'=39 +'fract'=40 +'relu'=41 +'softplus'=42 +'gelu'=43 +'sign'=44 +'map'=45 +'swap'=48 +'range'=51 +'topk'=52 +'botk'=53 +'pinv'=54 +'sum'=55 +'mean'=56 +'std'=57 +'var'=58 +'quartile'=59 +'dot'=61 +'+'=62 +'-'=63 +'*'=64 +'/'=65 +'%'=66 +'^'=67 +'>='=68 +'>'=69 +'<='=70 +'<'=71 +'=='=72 +'!='=73 +'|'=74 +'('=75 +')'=76 +','=77 +'['=78 +']'=79 diff --git a/more_math/Parser/MathExprLexer.interp b/more_math/Parser/MathExprLexer.interp index 774123f..5dd43fc 100644 --- a/more_math/Parser/MathExprLexer.interp +++ b/more_math/Parser/MathExprLexer.interp @@ -1,10 +1,5 @@ token literal names: null -'(' -')' -'[' -',' -']' 'sin' 'cos' 'tan' @@ -59,6 +54,13 @@ null 'topk' 'botk' 'pinv' +'sum' +'mean' +'std' +'var' +'quartile' +null +'dot' '+' '-' '*' @@ -72,6 +74,11 @@ null '==' '!=' '|' +'(' +')' +',' +'[' +']' null null null @@ -79,11 +86,6 @@ null token symbolic names: null -null -null -null -null -null SIN COS TAN @@ -138,6 +140,13 @@ RANGE TOPK BOTK PINV +SUM +MEAN +STD +VAR +QUARTILE +PERCENTILE +DOT PLUS MINUS MULT @@ -151,17 +160,17 @@ LT EQ NE PIPE +LPAREN +RPAREN +COMMA +LBRACKET +RBRACKET CONSTANT NUMBER VARIABLE WS rule names: -T__0 -T__1 -T__2 -T__3 -T__4 SIN COS TAN @@ -216,6 +225,13 @@ RANGE TOPK BOTK PINV +SUM +MEAN +STD +VAR +QUARTILE +PERCENTILE +DOT PLUS MINUS MULT @@ -229,6 +245,11 @@ LT EQ NE PIPE +LPAREN +RPAREN +COMMA +LBRACKET +RBRACKET CONSTANT NUMBER VARIABLE @@ -242,4 +263,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 76, 566, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 356, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 432, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 449, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 467, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 480, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 538, 8, 72, 1, 73, 4, 73, 541, 8, 73, 11, 73, 12, 73, 542, 1, 73, 1, 73, 4, 73, 547, 8, 73, 11, 73, 12, 73, 548, 3, 73, 551, 8, 73, 1, 74, 1, 74, 5, 74, 555, 8, 74, 10, 74, 12, 74, 558, 9, 74, 1, 75, 4, 75, 561, 8, 75, 11, 75, 12, 75, 562, 1, 75, 1, 75, 0, 0, 76, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 1, 0, 5, 2, 0, 69, 69, 101, 101, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 3, 0, 9, 10, 13, 13, 32, 32, 577, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 3, 155, 1, 0, 0, 0, 5, 157, 1, 0, 0, 0, 7, 159, 1, 0, 0, 0, 9, 161, 1, 0, 0, 0, 11, 163, 1, 0, 0, 0, 13, 167, 1, 0, 0, 0, 15, 171, 1, 0, 0, 0, 17, 175, 1, 0, 0, 0, 19, 180, 1, 0, 0, 0, 21, 185, 1, 0, 0, 0, 23, 190, 1, 0, 0, 0, 25, 196, 1, 0, 0, 0, 27, 201, 1, 0, 0, 0, 29, 206, 1, 0, 0, 0, 31, 211, 1, 0, 0, 0, 33, 217, 1, 0, 0, 0, 35, 223, 1, 0, 0, 0, 37, 229, 1, 0, 0, 0, 39, 233, 1, 0, 0, 0, 41, 238, 1, 0, 0, 0, 43, 241, 1, 0, 0, 0, 45, 245, 1, 0, 0, 0, 47, 249, 1, 0, 0, 0, 49, 254, 1, 0, 0, 0, 51, 259, 1, 0, 0, 0, 53, 264, 1, 0, 0, 0, 55, 269, 1, 0, 0, 0, 57, 275, 1, 0, 0, 0, 59, 281, 1, 0, 0, 0, 61, 287, 1, 0, 0, 0, 63, 292, 1, 0, 0, 0, 65, 298, 1, 0, 0, 0, 67, 304, 1, 0, 0, 0, 69, 308, 1, 0, 0, 0, 71, 313, 1, 0, 0, 0, 73, 319, 1, 0, 0, 0, 75, 323, 1, 0, 0, 0, 77, 328, 1, 0, 0, 0, 79, 334, 1, 0, 0, 0, 81, 355, 1, 0, 0, 0, 83, 357, 1, 0, 0, 0, 85, 362, 1, 0, 0, 0, 87, 367, 1, 0, 0, 0, 89, 378, 1, 0, 0, 0, 91, 384, 1, 0, 0, 0, 93, 389, 1, 0, 0, 0, 95, 398, 1, 0, 0, 0, 97, 403, 1, 0, 0, 0, 99, 408, 1, 0, 0, 0, 101, 431, 1, 0, 0, 0, 103, 448, 1, 0, 0, 0, 105, 450, 1, 0, 0, 0, 107, 466, 1, 0, 0, 0, 109, 479, 1, 0, 0, 0, 111, 481, 1, 0, 0, 0, 113, 487, 1, 0, 0, 0, 115, 492, 1, 0, 0, 0, 117, 497, 1, 0, 0, 0, 119, 502, 1, 0, 0, 0, 121, 504, 1, 0, 0, 0, 123, 506, 1, 0, 0, 0, 125, 508, 1, 0, 0, 0, 127, 510, 1, 0, 0, 0, 129, 512, 1, 0, 0, 0, 131, 514, 1, 0, 0, 0, 133, 517, 1, 0, 0, 0, 135, 519, 1, 0, 0, 0, 137, 522, 1, 0, 0, 0, 139, 524, 1, 0, 0, 0, 141, 527, 1, 0, 0, 0, 143, 530, 1, 0, 0, 0, 145, 537, 1, 0, 0, 0, 147, 540, 1, 0, 0, 0, 149, 552, 1, 0, 0, 0, 151, 560, 1, 0, 0, 0, 153, 154, 5, 40, 0, 0, 154, 2, 1, 0, 0, 0, 155, 156, 5, 41, 0, 0, 156, 4, 1, 0, 0, 0, 157, 158, 5, 91, 0, 0, 158, 6, 1, 0, 0, 0, 159, 160, 5, 44, 0, 0, 160, 8, 1, 0, 0, 0, 161, 162, 5, 93, 0, 0, 162, 10, 1, 0, 0, 0, 163, 164, 5, 115, 0, 0, 164, 165, 5, 105, 0, 0, 165, 166, 5, 110, 0, 0, 166, 12, 1, 0, 0, 0, 167, 168, 5, 99, 0, 0, 168, 169, 5, 111, 0, 0, 169, 170, 5, 115, 0, 0, 170, 14, 1, 0, 0, 0, 171, 172, 5, 116, 0, 0, 172, 173, 5, 97, 0, 0, 173, 174, 5, 110, 0, 0, 174, 16, 1, 0, 0, 0, 175, 176, 5, 97, 0, 0, 176, 177, 5, 115, 0, 0, 177, 178, 5, 105, 0, 0, 178, 179, 5, 110, 0, 0, 179, 18, 1, 0, 0, 0, 180, 181, 5, 97, 0, 0, 181, 182, 5, 99, 0, 0, 182, 183, 5, 111, 0, 0, 183, 184, 5, 115, 0, 0, 184, 20, 1, 0, 0, 0, 185, 186, 5, 97, 0, 0, 186, 187, 5, 116, 0, 0, 187, 188, 5, 97, 0, 0, 188, 189, 5, 110, 0, 0, 189, 22, 1, 0, 0, 0, 190, 191, 5, 97, 0, 0, 191, 192, 5, 116, 0, 0, 192, 193, 5, 97, 0, 0, 193, 194, 5, 110, 0, 0, 194, 195, 5, 50, 0, 0, 195, 24, 1, 0, 0, 0, 196, 197, 5, 115, 0, 0, 197, 198, 5, 105, 0, 0, 198, 199, 5, 110, 0, 0, 199, 200, 5, 104, 0, 0, 200, 26, 1, 0, 0, 0, 201, 202, 5, 99, 0, 0, 202, 203, 5, 111, 0, 0, 203, 204, 5, 115, 0, 0, 204, 205, 5, 104, 0, 0, 205, 28, 1, 0, 0, 0, 206, 207, 5, 116, 0, 0, 207, 208, 5, 97, 0, 0, 208, 209, 5, 110, 0, 0, 209, 210, 5, 104, 0, 0, 210, 30, 1, 0, 0, 0, 211, 212, 5, 97, 0, 0, 212, 213, 5, 115, 0, 0, 213, 214, 5, 105, 0, 0, 214, 215, 5, 110, 0, 0, 215, 216, 5, 104, 0, 0, 216, 32, 1, 0, 0, 0, 217, 218, 5, 97, 0, 0, 218, 219, 5, 99, 0, 0, 219, 220, 5, 111, 0, 0, 220, 221, 5, 115, 0, 0, 221, 222, 5, 104, 0, 0, 222, 34, 1, 0, 0, 0, 223, 224, 5, 97, 0, 0, 224, 225, 5, 116, 0, 0, 225, 226, 5, 97, 0, 0, 226, 227, 5, 110, 0, 0, 227, 228, 5, 104, 0, 0, 228, 36, 1, 0, 0, 0, 229, 230, 5, 97, 0, 0, 230, 231, 5, 98, 0, 0, 231, 232, 5, 115, 0, 0, 232, 38, 1, 0, 0, 0, 233, 234, 5, 115, 0, 0, 234, 235, 5, 113, 0, 0, 235, 236, 5, 114, 0, 0, 236, 237, 5, 116, 0, 0, 237, 40, 1, 0, 0, 0, 238, 239, 5, 108, 0, 0, 239, 240, 5, 110, 0, 0, 240, 42, 1, 0, 0, 0, 241, 242, 5, 108, 0, 0, 242, 243, 5, 111, 0, 0, 243, 244, 5, 103, 0, 0, 244, 44, 1, 0, 0, 0, 245, 246, 5, 101, 0, 0, 246, 247, 5, 120, 0, 0, 247, 248, 5, 112, 0, 0, 248, 46, 1, 0, 0, 0, 249, 250, 5, 115, 0, 0, 250, 251, 5, 109, 0, 0, 251, 252, 5, 105, 0, 0, 252, 253, 5, 110, 0, 0, 253, 48, 1, 0, 0, 0, 254, 255, 5, 115, 0, 0, 255, 256, 5, 109, 0, 0, 256, 257, 5, 97, 0, 0, 257, 258, 5, 120, 0, 0, 258, 50, 1, 0, 0, 0, 259, 260, 5, 116, 0, 0, 260, 261, 5, 109, 0, 0, 261, 262, 5, 105, 0, 0, 262, 263, 5, 110, 0, 0, 263, 52, 1, 0, 0, 0, 264, 265, 5, 116, 0, 0, 265, 266, 5, 109, 0, 0, 266, 267, 5, 97, 0, 0, 267, 268, 5, 120, 0, 0, 268, 54, 1, 0, 0, 0, 269, 270, 5, 116, 0, 0, 270, 271, 5, 110, 0, 0, 271, 272, 5, 111, 0, 0, 272, 273, 5, 114, 0, 0, 273, 274, 5, 109, 0, 0, 274, 56, 1, 0, 0, 0, 275, 276, 5, 115, 0, 0, 276, 277, 5, 110, 0, 0, 277, 278, 5, 111, 0, 0, 278, 279, 5, 114, 0, 0, 279, 280, 5, 109, 0, 0, 280, 58, 1, 0, 0, 0, 281, 282, 5, 102, 0, 0, 282, 283, 5, 108, 0, 0, 283, 284, 5, 111, 0, 0, 284, 285, 5, 111, 0, 0, 285, 286, 5, 114, 0, 0, 286, 60, 1, 0, 0, 0, 287, 288, 5, 99, 0, 0, 288, 289, 5, 101, 0, 0, 289, 290, 5, 105, 0, 0, 290, 291, 5, 108, 0, 0, 291, 62, 1, 0, 0, 0, 292, 293, 5, 114, 0, 0, 293, 294, 5, 111, 0, 0, 294, 295, 5, 117, 0, 0, 295, 296, 5, 110, 0, 0, 296, 297, 5, 100, 0, 0, 297, 64, 1, 0, 0, 0, 298, 299, 5, 103, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 109, 0, 0, 301, 302, 5, 109, 0, 0, 302, 303, 5, 97, 0, 0, 303, 66, 1, 0, 0, 0, 304, 305, 5, 112, 0, 0, 305, 306, 5, 111, 0, 0, 306, 307, 5, 119, 0, 0, 307, 68, 1, 0, 0, 0, 308, 309, 5, 115, 0, 0, 309, 310, 5, 105, 0, 0, 310, 311, 5, 103, 0, 0, 311, 312, 5, 109, 0, 0, 312, 70, 1, 0, 0, 0, 313, 314, 5, 99, 0, 0, 314, 315, 5, 108, 0, 0, 315, 316, 5, 97, 0, 0, 316, 317, 5, 109, 0, 0, 317, 318, 5, 112, 0, 0, 318, 72, 1, 0, 0, 0, 319, 320, 5, 102, 0, 0, 320, 321, 5, 102, 0, 0, 321, 322, 5, 116, 0, 0, 322, 74, 1, 0, 0, 0, 323, 324, 5, 105, 0, 0, 324, 325, 5, 102, 0, 0, 325, 326, 5, 102, 0, 0, 326, 327, 5, 116, 0, 0, 327, 76, 1, 0, 0, 0, 328, 329, 5, 97, 0, 0, 329, 330, 5, 110, 0, 0, 330, 331, 5, 103, 0, 0, 331, 332, 5, 108, 0, 0, 332, 333, 5, 101, 0, 0, 333, 78, 1, 0, 0, 0, 334, 335, 5, 112, 0, 0, 335, 336, 5, 114, 0, 0, 336, 337, 5, 105, 0, 0, 337, 338, 5, 110, 0, 0, 338, 339, 5, 116, 0, 0, 339, 80, 1, 0, 0, 0, 340, 341, 5, 112, 0, 0, 341, 342, 5, 114, 0, 0, 342, 343, 5, 105, 0, 0, 343, 344, 5, 110, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 95, 0, 0, 346, 347, 5, 115, 0, 0, 347, 348, 5, 104, 0, 0, 348, 349, 5, 97, 0, 0, 349, 350, 5, 112, 0, 0, 350, 356, 5, 101, 0, 0, 351, 352, 5, 112, 0, 0, 352, 353, 5, 115, 0, 0, 353, 354, 5, 104, 0, 0, 354, 356, 5, 112, 0, 0, 355, 340, 1, 0, 0, 0, 355, 351, 1, 0, 0, 0, 356, 82, 1, 0, 0, 0, 357, 358, 5, 108, 0, 0, 358, 359, 5, 101, 0, 0, 359, 360, 5, 114, 0, 0, 360, 361, 5, 112, 0, 0, 361, 84, 1, 0, 0, 0, 362, 363, 5, 115, 0, 0, 363, 364, 5, 116, 0, 0, 364, 365, 5, 101, 0, 0, 365, 366, 5, 112, 0, 0, 366, 86, 1, 0, 0, 0, 367, 368, 5, 115, 0, 0, 368, 369, 5, 109, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 111, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 104, 0, 0, 373, 374, 5, 115, 0, 0, 374, 375, 5, 116, 0, 0, 375, 376, 5, 101, 0, 0, 376, 377, 5, 112, 0, 0, 377, 88, 1, 0, 0, 0, 378, 379, 5, 102, 0, 0, 379, 380, 5, 114, 0, 0, 380, 381, 5, 97, 0, 0, 381, 382, 5, 99, 0, 0, 382, 383, 5, 116, 0, 0, 383, 90, 1, 0, 0, 0, 384, 385, 5, 114, 0, 0, 385, 386, 5, 101, 0, 0, 386, 387, 5, 108, 0, 0, 387, 388, 5, 117, 0, 0, 388, 92, 1, 0, 0, 0, 389, 390, 5, 115, 0, 0, 390, 391, 5, 111, 0, 0, 391, 392, 5, 102, 0, 0, 392, 393, 5, 116, 0, 0, 393, 394, 5, 112, 0, 0, 394, 395, 5, 108, 0, 0, 395, 396, 5, 117, 0, 0, 396, 397, 5, 115, 0, 0, 397, 94, 1, 0, 0, 0, 398, 399, 5, 103, 0, 0, 399, 400, 5, 101, 0, 0, 400, 401, 5, 108, 0, 0, 401, 402, 5, 117, 0, 0, 402, 96, 1, 0, 0, 0, 403, 404, 5, 115, 0, 0, 404, 405, 5, 105, 0, 0, 405, 406, 5, 103, 0, 0, 406, 407, 5, 110, 0, 0, 407, 98, 1, 0, 0, 0, 408, 409, 5, 109, 0, 0, 409, 410, 5, 97, 0, 0, 410, 411, 5, 112, 0, 0, 411, 100, 1, 0, 0, 0, 412, 413, 5, 101, 0, 0, 413, 414, 5, 122, 0, 0, 414, 415, 5, 99, 0, 0, 415, 416, 5, 111, 0, 0, 416, 417, 5, 110, 0, 0, 417, 418, 5, 118, 0, 0, 418, 419, 5, 111, 0, 0, 419, 420, 5, 108, 0, 0, 420, 421, 5, 117, 0, 0, 421, 422, 5, 116, 0, 0, 422, 423, 5, 105, 0, 0, 423, 424, 5, 111, 0, 0, 424, 432, 5, 110, 0, 0, 425, 426, 5, 101, 0, 0, 426, 427, 5, 122, 0, 0, 427, 428, 5, 99, 0, 0, 428, 429, 5, 111, 0, 0, 429, 430, 5, 110, 0, 0, 430, 432, 5, 118, 0, 0, 431, 412, 1, 0, 0, 0, 431, 425, 1, 0, 0, 0, 432, 102, 1, 0, 0, 0, 433, 434, 5, 99, 0, 0, 434, 435, 5, 111, 0, 0, 435, 436, 5, 110, 0, 0, 436, 437, 5, 118, 0, 0, 437, 438, 5, 111, 0, 0, 438, 439, 5, 108, 0, 0, 439, 440, 5, 117, 0, 0, 440, 441, 5, 116, 0, 0, 441, 442, 5, 105, 0, 0, 442, 443, 5, 111, 0, 0, 443, 449, 5, 110, 0, 0, 444, 445, 5, 99, 0, 0, 445, 446, 5, 111, 0, 0, 446, 447, 5, 110, 0, 0, 447, 449, 5, 118, 0, 0, 448, 433, 1, 0, 0, 0, 448, 444, 1, 0, 0, 0, 449, 104, 1, 0, 0, 0, 450, 451, 5, 115, 0, 0, 451, 452, 5, 119, 0, 0, 452, 453, 5, 97, 0, 0, 453, 454, 5, 112, 0, 0, 454, 106, 1, 0, 0, 0, 455, 456, 5, 112, 0, 0, 456, 457, 5, 101, 0, 0, 457, 458, 5, 114, 0, 0, 458, 459, 5, 109, 0, 0, 459, 460, 5, 117, 0, 0, 460, 461, 5, 116, 0, 0, 461, 467, 5, 101, 0, 0, 462, 463, 5, 112, 0, 0, 463, 464, 5, 101, 0, 0, 464, 465, 5, 114, 0, 0, 465, 467, 5, 109, 0, 0, 466, 455, 1, 0, 0, 0, 466, 462, 1, 0, 0, 0, 467, 108, 1, 0, 0, 0, 468, 469, 5, 114, 0, 0, 469, 470, 5, 101, 0, 0, 470, 471, 5, 115, 0, 0, 471, 472, 5, 104, 0, 0, 472, 473, 5, 97, 0, 0, 473, 474, 5, 112, 0, 0, 474, 480, 5, 101, 0, 0, 475, 476, 5, 114, 0, 0, 476, 477, 5, 115, 0, 0, 477, 478, 5, 104, 0, 0, 478, 480, 5, 112, 0, 0, 479, 468, 1, 0, 0, 0, 479, 475, 1, 0, 0, 0, 480, 110, 1, 0, 0, 0, 481, 482, 5, 114, 0, 0, 482, 483, 5, 97, 0, 0, 483, 484, 5, 110, 0, 0, 484, 485, 5, 103, 0, 0, 485, 486, 5, 101, 0, 0, 486, 112, 1, 0, 0, 0, 487, 488, 5, 116, 0, 0, 488, 489, 5, 111, 0, 0, 489, 490, 5, 112, 0, 0, 490, 491, 5, 107, 0, 0, 491, 114, 1, 0, 0, 0, 492, 493, 5, 98, 0, 0, 493, 494, 5, 111, 0, 0, 494, 495, 5, 116, 0, 0, 495, 496, 5, 107, 0, 0, 496, 116, 1, 0, 0, 0, 497, 498, 5, 112, 0, 0, 498, 499, 5, 105, 0, 0, 499, 500, 5, 110, 0, 0, 500, 501, 5, 118, 0, 0, 501, 118, 1, 0, 0, 0, 502, 503, 5, 43, 0, 0, 503, 120, 1, 0, 0, 0, 504, 505, 5, 45, 0, 0, 505, 122, 1, 0, 0, 0, 506, 507, 5, 42, 0, 0, 507, 124, 1, 0, 0, 0, 508, 509, 5, 47, 0, 0, 509, 126, 1, 0, 0, 0, 510, 511, 5, 37, 0, 0, 511, 128, 1, 0, 0, 0, 512, 513, 5, 94, 0, 0, 513, 130, 1, 0, 0, 0, 514, 515, 5, 62, 0, 0, 515, 516, 5, 61, 0, 0, 516, 132, 1, 0, 0, 0, 517, 518, 5, 62, 0, 0, 518, 134, 1, 0, 0, 0, 519, 520, 5, 60, 0, 0, 520, 521, 5, 61, 0, 0, 521, 136, 1, 0, 0, 0, 522, 523, 5, 60, 0, 0, 523, 138, 1, 0, 0, 0, 524, 525, 5, 61, 0, 0, 525, 526, 5, 61, 0, 0, 526, 140, 1, 0, 0, 0, 527, 528, 5, 33, 0, 0, 528, 529, 5, 61, 0, 0, 529, 142, 1, 0, 0, 0, 530, 531, 5, 124, 0, 0, 531, 144, 1, 0, 0, 0, 532, 533, 5, 112, 0, 0, 533, 538, 5, 105, 0, 0, 534, 535, 5, 80, 0, 0, 535, 538, 5, 73, 0, 0, 536, 538, 7, 0, 0, 0, 537, 532, 1, 0, 0, 0, 537, 534, 1, 0, 0, 0, 537, 536, 1, 0, 0, 0, 538, 146, 1, 0, 0, 0, 539, 541, 7, 1, 0, 0, 540, 539, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 540, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 550, 1, 0, 0, 0, 544, 546, 5, 46, 0, 0, 545, 547, 7, 1, 0, 0, 546, 545, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 551, 1, 0, 0, 0, 550, 544, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 148, 1, 0, 0, 0, 552, 556, 7, 2, 0, 0, 553, 555, 7, 3, 0, 0, 554, 553, 1, 0, 0, 0, 555, 558, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 150, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 559, 561, 7, 4, 0, 0, 560, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 6, 75, 0, 0, 565, 152, 1, 0, 0, 0, 12, 0, 355, 431, 448, 466, 479, 537, 542, 548, 550, 556, 562, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 83, 627, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 360, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 436, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 453, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 471, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 484, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 548, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 599, 8, 79, 1, 80, 4, 80, 602, 8, 80, 11, 80, 12, 80, 603, 1, 80, 1, 80, 4, 80, 608, 8, 80, 11, 80, 12, 80, 609, 3, 80, 612, 8, 80, 1, 81, 1, 81, 5, 81, 616, 8, 81, 10, 81, 12, 81, 619, 9, 81, 1, 82, 4, 82, 622, 8, 82, 11, 82, 12, 82, 623, 1, 82, 1, 82, 0, 0, 83, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 1, 0, 5, 2, 0, 69, 69, 101, 101, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 3, 0, 9, 10, 13, 13, 32, 32, 639, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 3, 171, 1, 0, 0, 0, 5, 175, 1, 0, 0, 0, 7, 179, 1, 0, 0, 0, 9, 184, 1, 0, 0, 0, 11, 189, 1, 0, 0, 0, 13, 194, 1, 0, 0, 0, 15, 200, 1, 0, 0, 0, 17, 205, 1, 0, 0, 0, 19, 210, 1, 0, 0, 0, 21, 215, 1, 0, 0, 0, 23, 221, 1, 0, 0, 0, 25, 227, 1, 0, 0, 0, 27, 233, 1, 0, 0, 0, 29, 237, 1, 0, 0, 0, 31, 242, 1, 0, 0, 0, 33, 245, 1, 0, 0, 0, 35, 249, 1, 0, 0, 0, 37, 253, 1, 0, 0, 0, 39, 258, 1, 0, 0, 0, 41, 263, 1, 0, 0, 0, 43, 268, 1, 0, 0, 0, 45, 273, 1, 0, 0, 0, 47, 279, 1, 0, 0, 0, 49, 285, 1, 0, 0, 0, 51, 291, 1, 0, 0, 0, 53, 296, 1, 0, 0, 0, 55, 302, 1, 0, 0, 0, 57, 308, 1, 0, 0, 0, 59, 312, 1, 0, 0, 0, 61, 317, 1, 0, 0, 0, 63, 323, 1, 0, 0, 0, 65, 327, 1, 0, 0, 0, 67, 332, 1, 0, 0, 0, 69, 338, 1, 0, 0, 0, 71, 359, 1, 0, 0, 0, 73, 361, 1, 0, 0, 0, 75, 366, 1, 0, 0, 0, 77, 371, 1, 0, 0, 0, 79, 382, 1, 0, 0, 0, 81, 388, 1, 0, 0, 0, 83, 393, 1, 0, 0, 0, 85, 402, 1, 0, 0, 0, 87, 407, 1, 0, 0, 0, 89, 412, 1, 0, 0, 0, 91, 435, 1, 0, 0, 0, 93, 452, 1, 0, 0, 0, 95, 454, 1, 0, 0, 0, 97, 470, 1, 0, 0, 0, 99, 483, 1, 0, 0, 0, 101, 485, 1, 0, 0, 0, 103, 491, 1, 0, 0, 0, 105, 496, 1, 0, 0, 0, 107, 501, 1, 0, 0, 0, 109, 506, 1, 0, 0, 0, 111, 510, 1, 0, 0, 0, 113, 515, 1, 0, 0, 0, 115, 519, 1, 0, 0, 0, 117, 523, 1, 0, 0, 0, 119, 547, 1, 0, 0, 0, 121, 549, 1, 0, 0, 0, 123, 553, 1, 0, 0, 0, 125, 555, 1, 0, 0, 0, 127, 557, 1, 0, 0, 0, 129, 559, 1, 0, 0, 0, 131, 561, 1, 0, 0, 0, 133, 563, 1, 0, 0, 0, 135, 565, 1, 0, 0, 0, 137, 568, 1, 0, 0, 0, 139, 570, 1, 0, 0, 0, 141, 573, 1, 0, 0, 0, 143, 575, 1, 0, 0, 0, 145, 578, 1, 0, 0, 0, 147, 581, 1, 0, 0, 0, 149, 583, 1, 0, 0, 0, 151, 585, 1, 0, 0, 0, 153, 587, 1, 0, 0, 0, 155, 589, 1, 0, 0, 0, 157, 591, 1, 0, 0, 0, 159, 598, 1, 0, 0, 0, 161, 601, 1, 0, 0, 0, 163, 613, 1, 0, 0, 0, 165, 621, 1, 0, 0, 0, 167, 168, 5, 115, 0, 0, 168, 169, 5, 105, 0, 0, 169, 170, 5, 110, 0, 0, 170, 2, 1, 0, 0, 0, 171, 172, 5, 99, 0, 0, 172, 173, 5, 111, 0, 0, 173, 174, 5, 115, 0, 0, 174, 4, 1, 0, 0, 0, 175, 176, 5, 116, 0, 0, 176, 177, 5, 97, 0, 0, 177, 178, 5, 110, 0, 0, 178, 6, 1, 0, 0, 0, 179, 180, 5, 97, 0, 0, 180, 181, 5, 115, 0, 0, 181, 182, 5, 105, 0, 0, 182, 183, 5, 110, 0, 0, 183, 8, 1, 0, 0, 0, 184, 185, 5, 97, 0, 0, 185, 186, 5, 99, 0, 0, 186, 187, 5, 111, 0, 0, 187, 188, 5, 115, 0, 0, 188, 10, 1, 0, 0, 0, 189, 190, 5, 97, 0, 0, 190, 191, 5, 116, 0, 0, 191, 192, 5, 97, 0, 0, 192, 193, 5, 110, 0, 0, 193, 12, 1, 0, 0, 0, 194, 195, 5, 97, 0, 0, 195, 196, 5, 116, 0, 0, 196, 197, 5, 97, 0, 0, 197, 198, 5, 110, 0, 0, 198, 199, 5, 50, 0, 0, 199, 14, 1, 0, 0, 0, 200, 201, 5, 115, 0, 0, 201, 202, 5, 105, 0, 0, 202, 203, 5, 110, 0, 0, 203, 204, 5, 104, 0, 0, 204, 16, 1, 0, 0, 0, 205, 206, 5, 99, 0, 0, 206, 207, 5, 111, 0, 0, 207, 208, 5, 115, 0, 0, 208, 209, 5, 104, 0, 0, 209, 18, 1, 0, 0, 0, 210, 211, 5, 116, 0, 0, 211, 212, 5, 97, 0, 0, 212, 213, 5, 110, 0, 0, 213, 214, 5, 104, 0, 0, 214, 20, 1, 0, 0, 0, 215, 216, 5, 97, 0, 0, 216, 217, 5, 115, 0, 0, 217, 218, 5, 105, 0, 0, 218, 219, 5, 110, 0, 0, 219, 220, 5, 104, 0, 0, 220, 22, 1, 0, 0, 0, 221, 222, 5, 97, 0, 0, 222, 223, 5, 99, 0, 0, 223, 224, 5, 111, 0, 0, 224, 225, 5, 115, 0, 0, 225, 226, 5, 104, 0, 0, 226, 24, 1, 0, 0, 0, 227, 228, 5, 97, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 97, 0, 0, 230, 231, 5, 110, 0, 0, 231, 232, 5, 104, 0, 0, 232, 26, 1, 0, 0, 0, 233, 234, 5, 97, 0, 0, 234, 235, 5, 98, 0, 0, 235, 236, 5, 115, 0, 0, 236, 28, 1, 0, 0, 0, 237, 238, 5, 115, 0, 0, 238, 239, 5, 113, 0, 0, 239, 240, 5, 114, 0, 0, 240, 241, 5, 116, 0, 0, 241, 30, 1, 0, 0, 0, 242, 243, 5, 108, 0, 0, 243, 244, 5, 110, 0, 0, 244, 32, 1, 0, 0, 0, 245, 246, 5, 108, 0, 0, 246, 247, 5, 111, 0, 0, 247, 248, 5, 103, 0, 0, 248, 34, 1, 0, 0, 0, 249, 250, 5, 101, 0, 0, 250, 251, 5, 120, 0, 0, 251, 252, 5, 112, 0, 0, 252, 36, 1, 0, 0, 0, 253, 254, 5, 115, 0, 0, 254, 255, 5, 109, 0, 0, 255, 256, 5, 105, 0, 0, 256, 257, 5, 110, 0, 0, 257, 38, 1, 0, 0, 0, 258, 259, 5, 115, 0, 0, 259, 260, 5, 109, 0, 0, 260, 261, 5, 97, 0, 0, 261, 262, 5, 120, 0, 0, 262, 40, 1, 0, 0, 0, 263, 264, 5, 116, 0, 0, 264, 265, 5, 109, 0, 0, 265, 266, 5, 105, 0, 0, 266, 267, 5, 110, 0, 0, 267, 42, 1, 0, 0, 0, 268, 269, 5, 116, 0, 0, 269, 270, 5, 109, 0, 0, 270, 271, 5, 97, 0, 0, 271, 272, 5, 120, 0, 0, 272, 44, 1, 0, 0, 0, 273, 274, 5, 116, 0, 0, 274, 275, 5, 110, 0, 0, 275, 276, 5, 111, 0, 0, 276, 277, 5, 114, 0, 0, 277, 278, 5, 109, 0, 0, 278, 46, 1, 0, 0, 0, 279, 280, 5, 115, 0, 0, 280, 281, 5, 110, 0, 0, 281, 282, 5, 111, 0, 0, 282, 283, 5, 114, 0, 0, 283, 284, 5, 109, 0, 0, 284, 48, 1, 0, 0, 0, 285, 286, 5, 102, 0, 0, 286, 287, 5, 108, 0, 0, 287, 288, 5, 111, 0, 0, 288, 289, 5, 111, 0, 0, 289, 290, 5, 114, 0, 0, 290, 50, 1, 0, 0, 0, 291, 292, 5, 99, 0, 0, 292, 293, 5, 101, 0, 0, 293, 294, 5, 105, 0, 0, 294, 295, 5, 108, 0, 0, 295, 52, 1, 0, 0, 0, 296, 297, 5, 114, 0, 0, 297, 298, 5, 111, 0, 0, 298, 299, 5, 117, 0, 0, 299, 300, 5, 110, 0, 0, 300, 301, 5, 100, 0, 0, 301, 54, 1, 0, 0, 0, 302, 303, 5, 103, 0, 0, 303, 304, 5, 97, 0, 0, 304, 305, 5, 109, 0, 0, 305, 306, 5, 109, 0, 0, 306, 307, 5, 97, 0, 0, 307, 56, 1, 0, 0, 0, 308, 309, 5, 112, 0, 0, 309, 310, 5, 111, 0, 0, 310, 311, 5, 119, 0, 0, 311, 58, 1, 0, 0, 0, 312, 313, 5, 115, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 103, 0, 0, 315, 316, 5, 109, 0, 0, 316, 60, 1, 0, 0, 0, 317, 318, 5, 99, 0, 0, 318, 319, 5, 108, 0, 0, 319, 320, 5, 97, 0, 0, 320, 321, 5, 109, 0, 0, 321, 322, 5, 112, 0, 0, 322, 62, 1, 0, 0, 0, 323, 324, 5, 102, 0, 0, 324, 325, 5, 102, 0, 0, 325, 326, 5, 116, 0, 0, 326, 64, 1, 0, 0, 0, 327, 328, 5, 105, 0, 0, 328, 329, 5, 102, 0, 0, 329, 330, 5, 102, 0, 0, 330, 331, 5, 116, 0, 0, 331, 66, 1, 0, 0, 0, 332, 333, 5, 97, 0, 0, 333, 334, 5, 110, 0, 0, 334, 335, 5, 103, 0, 0, 335, 336, 5, 108, 0, 0, 336, 337, 5, 101, 0, 0, 337, 68, 1, 0, 0, 0, 338, 339, 5, 112, 0, 0, 339, 340, 5, 114, 0, 0, 340, 341, 5, 105, 0, 0, 341, 342, 5, 110, 0, 0, 342, 343, 5, 116, 0, 0, 343, 70, 1, 0, 0, 0, 344, 345, 5, 112, 0, 0, 345, 346, 5, 114, 0, 0, 346, 347, 5, 105, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 116, 0, 0, 349, 350, 5, 95, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 104, 0, 0, 352, 353, 5, 97, 0, 0, 353, 354, 5, 112, 0, 0, 354, 360, 5, 101, 0, 0, 355, 356, 5, 112, 0, 0, 356, 357, 5, 115, 0, 0, 357, 358, 5, 104, 0, 0, 358, 360, 5, 112, 0, 0, 359, 344, 1, 0, 0, 0, 359, 355, 1, 0, 0, 0, 360, 72, 1, 0, 0, 0, 361, 362, 5, 108, 0, 0, 362, 363, 5, 101, 0, 0, 363, 364, 5, 114, 0, 0, 364, 365, 5, 112, 0, 0, 365, 74, 1, 0, 0, 0, 366, 367, 5, 115, 0, 0, 367, 368, 5, 116, 0, 0, 368, 369, 5, 101, 0, 0, 369, 370, 5, 112, 0, 0, 370, 76, 1, 0, 0, 0, 371, 372, 5, 115, 0, 0, 372, 373, 5, 109, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 111, 0, 0, 375, 376, 5, 116, 0, 0, 376, 377, 5, 104, 0, 0, 377, 378, 5, 115, 0, 0, 378, 379, 5, 116, 0, 0, 379, 380, 5, 101, 0, 0, 380, 381, 5, 112, 0, 0, 381, 78, 1, 0, 0, 0, 382, 383, 5, 102, 0, 0, 383, 384, 5, 114, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 99, 0, 0, 386, 387, 5, 116, 0, 0, 387, 80, 1, 0, 0, 0, 388, 389, 5, 114, 0, 0, 389, 390, 5, 101, 0, 0, 390, 391, 5, 108, 0, 0, 391, 392, 5, 117, 0, 0, 392, 82, 1, 0, 0, 0, 393, 394, 5, 115, 0, 0, 394, 395, 5, 111, 0, 0, 395, 396, 5, 102, 0, 0, 396, 397, 5, 116, 0, 0, 397, 398, 5, 112, 0, 0, 398, 399, 5, 108, 0, 0, 399, 400, 5, 117, 0, 0, 400, 401, 5, 115, 0, 0, 401, 84, 1, 0, 0, 0, 402, 403, 5, 103, 0, 0, 403, 404, 5, 101, 0, 0, 404, 405, 5, 108, 0, 0, 405, 406, 5, 117, 0, 0, 406, 86, 1, 0, 0, 0, 407, 408, 5, 115, 0, 0, 408, 409, 5, 105, 0, 0, 409, 410, 5, 103, 0, 0, 410, 411, 5, 110, 0, 0, 411, 88, 1, 0, 0, 0, 412, 413, 5, 109, 0, 0, 413, 414, 5, 97, 0, 0, 414, 415, 5, 112, 0, 0, 415, 90, 1, 0, 0, 0, 416, 417, 5, 101, 0, 0, 417, 418, 5, 122, 0, 0, 418, 419, 5, 99, 0, 0, 419, 420, 5, 111, 0, 0, 420, 421, 5, 110, 0, 0, 421, 422, 5, 118, 0, 0, 422, 423, 5, 111, 0, 0, 423, 424, 5, 108, 0, 0, 424, 425, 5, 117, 0, 0, 425, 426, 5, 116, 0, 0, 426, 427, 5, 105, 0, 0, 427, 428, 5, 111, 0, 0, 428, 436, 5, 110, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 122, 0, 0, 431, 432, 5, 99, 0, 0, 432, 433, 5, 111, 0, 0, 433, 434, 5, 110, 0, 0, 434, 436, 5, 118, 0, 0, 435, 416, 1, 0, 0, 0, 435, 429, 1, 0, 0, 0, 436, 92, 1, 0, 0, 0, 437, 438, 5, 99, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 110, 0, 0, 440, 441, 5, 118, 0, 0, 441, 442, 5, 111, 0, 0, 442, 443, 5, 108, 0, 0, 443, 444, 5, 117, 0, 0, 444, 445, 5, 116, 0, 0, 445, 446, 5, 105, 0, 0, 446, 447, 5, 111, 0, 0, 447, 453, 5, 110, 0, 0, 448, 449, 5, 99, 0, 0, 449, 450, 5, 111, 0, 0, 450, 451, 5, 110, 0, 0, 451, 453, 5, 118, 0, 0, 452, 437, 1, 0, 0, 0, 452, 448, 1, 0, 0, 0, 453, 94, 1, 0, 0, 0, 454, 455, 5, 115, 0, 0, 455, 456, 5, 119, 0, 0, 456, 457, 5, 97, 0, 0, 457, 458, 5, 112, 0, 0, 458, 96, 1, 0, 0, 0, 459, 460, 5, 112, 0, 0, 460, 461, 5, 101, 0, 0, 461, 462, 5, 114, 0, 0, 462, 463, 5, 109, 0, 0, 463, 464, 5, 117, 0, 0, 464, 465, 5, 116, 0, 0, 465, 471, 5, 101, 0, 0, 466, 467, 5, 112, 0, 0, 467, 468, 5, 101, 0, 0, 468, 469, 5, 114, 0, 0, 469, 471, 5, 109, 0, 0, 470, 459, 1, 0, 0, 0, 470, 466, 1, 0, 0, 0, 471, 98, 1, 0, 0, 0, 472, 473, 5, 114, 0, 0, 473, 474, 5, 101, 0, 0, 474, 475, 5, 115, 0, 0, 475, 476, 5, 104, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 112, 0, 0, 478, 484, 5, 101, 0, 0, 479, 480, 5, 114, 0, 0, 480, 481, 5, 115, 0, 0, 481, 482, 5, 104, 0, 0, 482, 484, 5, 112, 0, 0, 483, 472, 1, 0, 0, 0, 483, 479, 1, 0, 0, 0, 484, 100, 1, 0, 0, 0, 485, 486, 5, 114, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 110, 0, 0, 488, 489, 5, 103, 0, 0, 489, 490, 5, 101, 0, 0, 490, 102, 1, 0, 0, 0, 491, 492, 5, 116, 0, 0, 492, 493, 5, 111, 0, 0, 493, 494, 5, 112, 0, 0, 494, 495, 5, 107, 0, 0, 495, 104, 1, 0, 0, 0, 496, 497, 5, 98, 0, 0, 497, 498, 5, 111, 0, 0, 498, 499, 5, 116, 0, 0, 499, 500, 5, 107, 0, 0, 500, 106, 1, 0, 0, 0, 501, 502, 5, 112, 0, 0, 502, 503, 5, 105, 0, 0, 503, 504, 5, 110, 0, 0, 504, 505, 5, 118, 0, 0, 505, 108, 1, 0, 0, 0, 506, 507, 5, 115, 0, 0, 507, 508, 5, 117, 0, 0, 508, 509, 5, 109, 0, 0, 509, 110, 1, 0, 0, 0, 510, 511, 5, 109, 0, 0, 511, 512, 5, 101, 0, 0, 512, 513, 5, 97, 0, 0, 513, 514, 5, 110, 0, 0, 514, 112, 1, 0, 0, 0, 515, 516, 5, 115, 0, 0, 516, 517, 5, 116, 0, 0, 517, 518, 5, 100, 0, 0, 518, 114, 1, 0, 0, 0, 519, 520, 5, 118, 0, 0, 520, 521, 5, 97, 0, 0, 521, 522, 5, 114, 0, 0, 522, 116, 1, 0, 0, 0, 523, 524, 5, 113, 0, 0, 524, 525, 5, 117, 0, 0, 525, 526, 5, 97, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 116, 0, 0, 528, 529, 5, 105, 0, 0, 529, 530, 5, 108, 0, 0, 530, 531, 5, 101, 0, 0, 531, 118, 1, 0, 0, 0, 532, 533, 5, 112, 0, 0, 533, 534, 5, 101, 0, 0, 534, 535, 5, 114, 0, 0, 535, 536, 5, 99, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 110, 0, 0, 538, 539, 5, 116, 0, 0, 539, 540, 5, 105, 0, 0, 540, 541, 5, 108, 0, 0, 541, 548, 5, 101, 0, 0, 542, 543, 5, 112, 0, 0, 543, 544, 5, 114, 0, 0, 544, 545, 5, 99, 0, 0, 545, 546, 5, 110, 0, 0, 546, 548, 5, 116, 0, 0, 547, 532, 1, 0, 0, 0, 547, 542, 1, 0, 0, 0, 548, 120, 1, 0, 0, 0, 549, 550, 5, 100, 0, 0, 550, 551, 5, 111, 0, 0, 551, 552, 5, 116, 0, 0, 552, 122, 1, 0, 0, 0, 553, 554, 5, 43, 0, 0, 554, 124, 1, 0, 0, 0, 555, 556, 5, 45, 0, 0, 556, 126, 1, 0, 0, 0, 557, 558, 5, 42, 0, 0, 558, 128, 1, 0, 0, 0, 559, 560, 5, 47, 0, 0, 560, 130, 1, 0, 0, 0, 561, 562, 5, 37, 0, 0, 562, 132, 1, 0, 0, 0, 563, 564, 5, 94, 0, 0, 564, 134, 1, 0, 0, 0, 565, 566, 5, 62, 0, 0, 566, 567, 5, 61, 0, 0, 567, 136, 1, 0, 0, 0, 568, 569, 5, 62, 0, 0, 569, 138, 1, 0, 0, 0, 570, 571, 5, 60, 0, 0, 571, 572, 5, 61, 0, 0, 572, 140, 1, 0, 0, 0, 573, 574, 5, 60, 0, 0, 574, 142, 1, 0, 0, 0, 575, 576, 5, 61, 0, 0, 576, 577, 5, 61, 0, 0, 577, 144, 1, 0, 0, 0, 578, 579, 5, 33, 0, 0, 579, 580, 5, 61, 0, 0, 580, 146, 1, 0, 0, 0, 581, 582, 5, 124, 0, 0, 582, 148, 1, 0, 0, 0, 583, 584, 5, 40, 0, 0, 584, 150, 1, 0, 0, 0, 585, 586, 5, 41, 0, 0, 586, 152, 1, 0, 0, 0, 587, 588, 5, 44, 0, 0, 588, 154, 1, 0, 0, 0, 589, 590, 5, 91, 0, 0, 590, 156, 1, 0, 0, 0, 591, 592, 5, 93, 0, 0, 592, 158, 1, 0, 0, 0, 593, 594, 5, 112, 0, 0, 594, 599, 5, 105, 0, 0, 595, 596, 5, 80, 0, 0, 596, 599, 5, 73, 0, 0, 597, 599, 7, 0, 0, 0, 598, 593, 1, 0, 0, 0, 598, 595, 1, 0, 0, 0, 598, 597, 1, 0, 0, 0, 599, 160, 1, 0, 0, 0, 600, 602, 7, 1, 0, 0, 601, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 611, 1, 0, 0, 0, 605, 607, 5, 46, 0, 0, 606, 608, 7, 1, 0, 0, 607, 606, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 605, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 162, 1, 0, 0, 0, 613, 617, 7, 2, 0, 0, 614, 616, 7, 3, 0, 0, 615, 614, 1, 0, 0, 0, 616, 619, 1, 0, 0, 0, 617, 615, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 164, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 620, 622, 7, 4, 0, 0, 621, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 6, 82, 0, 0, 626, 166, 1, 0, 0, 0, 13, 0, 359, 435, 452, 470, 483, 547, 598, 603, 609, 611, 617, 623, 1, 6, 0, 0] \ No newline at end of file diff --git a/more_math/Parser/MathExprLexer.py b/more_math/Parser/MathExprLexer.py index 6ae4f13..150f4ff 100644 --- a/more_math/Parser/MathExprLexer.py +++ b/more_math/Parser/MathExprLexer.py @@ -1,4 +1,4 @@ -# Generated from MathExpr.g4 by ANTLR 4.13.2 +# Generated from ./MathExpr.g4 by ANTLR 4.13.2 from antlr4 import * from io import StringIO import sys @@ -10,7 +10,7 @@ else: def serializedATN(): return [ - 4,0,76,566,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,83,627,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, 2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7, 19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2, @@ -21,195 +21,217 @@ def serializedATN(): 52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7, 58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2, 65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71,7, - 71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,1,0,1,0,1,1,1,1,1,2,1, - 2,1,3,1,3,1,4,1,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1, - 7,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1, - 10,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,13,1, - 13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1, - 15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1, - 17,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1, - 21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1, - 24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1, - 26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1, - 28,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,31,1, - 31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1, - 33,1,33,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1, - 36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1, - 38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1, - 40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,356,8,40,1, - 41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1, - 43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1, - 44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1, - 46,1,46,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,49,1, - 49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1, - 50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,3,50,432,8,50,1,51,1, - 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1, - 51,3,51,449,8,51,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1, - 53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,467,8,53,1,54,1,54,1,54,1, - 54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,480,8,54,1,55,1,55,1, - 55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1, - 57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,60,1,60,1,61,1,61,1,62,1, - 62,1,63,1,63,1,64,1,64,1,65,1,65,1,65,1,66,1,66,1,67,1,67,1,67,1, - 68,1,68,1,69,1,69,1,69,1,70,1,70,1,70,1,71,1,71,1,72,1,72,1,72,1, - 72,1,72,3,72,538,8,72,1,73,4,73,541,8,73,11,73,12,73,542,1,73,1, - 73,4,73,547,8,73,11,73,12,73,548,3,73,551,8,73,1,74,1,74,5,74,555, - 8,74,10,74,12,74,558,9,74,1,75,4,75,561,8,75,11,75,12,75,562,1,75, - 1,75,0,0,76,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11, - 23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22, - 45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33, - 67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44, - 89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54, - 109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127, - 64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73, - 147,74,149,75,151,76,1,0,5,2,0,69,69,101,101,1,0,48,57,3,0,65,90, - 95,95,97,122,4,0,48,57,65,90,95,95,97,122,3,0,9,10,13,13,32,32,577, - 0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11, - 1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21, - 1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31, - 1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41, - 1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51, - 1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61, - 1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71, - 1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81, - 1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91, - 1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101, - 1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0, - 0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1, - 0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0, - 129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0, - 0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147, - 1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,1,153,1,0,0,0,3,155,1,0,0,0, - 5,157,1,0,0,0,7,159,1,0,0,0,9,161,1,0,0,0,11,163,1,0,0,0,13,167, - 1,0,0,0,15,171,1,0,0,0,17,175,1,0,0,0,19,180,1,0,0,0,21,185,1,0, - 0,0,23,190,1,0,0,0,25,196,1,0,0,0,27,201,1,0,0,0,29,206,1,0,0,0, - 31,211,1,0,0,0,33,217,1,0,0,0,35,223,1,0,0,0,37,229,1,0,0,0,39,233, - 1,0,0,0,41,238,1,0,0,0,43,241,1,0,0,0,45,245,1,0,0,0,47,249,1,0, - 0,0,49,254,1,0,0,0,51,259,1,0,0,0,53,264,1,0,0,0,55,269,1,0,0,0, - 57,275,1,0,0,0,59,281,1,0,0,0,61,287,1,0,0,0,63,292,1,0,0,0,65,298, - 1,0,0,0,67,304,1,0,0,0,69,308,1,0,0,0,71,313,1,0,0,0,73,319,1,0, - 0,0,75,323,1,0,0,0,77,328,1,0,0,0,79,334,1,0,0,0,81,355,1,0,0,0, - 83,357,1,0,0,0,85,362,1,0,0,0,87,367,1,0,0,0,89,378,1,0,0,0,91,384, - 1,0,0,0,93,389,1,0,0,0,95,398,1,0,0,0,97,403,1,0,0,0,99,408,1,0, - 0,0,101,431,1,0,0,0,103,448,1,0,0,0,105,450,1,0,0,0,107,466,1,0, - 0,0,109,479,1,0,0,0,111,481,1,0,0,0,113,487,1,0,0,0,115,492,1,0, - 0,0,117,497,1,0,0,0,119,502,1,0,0,0,121,504,1,0,0,0,123,506,1,0, - 0,0,125,508,1,0,0,0,127,510,1,0,0,0,129,512,1,0,0,0,131,514,1,0, - 0,0,133,517,1,0,0,0,135,519,1,0,0,0,137,522,1,0,0,0,139,524,1,0, - 0,0,141,527,1,0,0,0,143,530,1,0,0,0,145,537,1,0,0,0,147,540,1,0, - 0,0,149,552,1,0,0,0,151,560,1,0,0,0,153,154,5,40,0,0,154,2,1,0,0, - 0,155,156,5,41,0,0,156,4,1,0,0,0,157,158,5,91,0,0,158,6,1,0,0,0, - 159,160,5,44,0,0,160,8,1,0,0,0,161,162,5,93,0,0,162,10,1,0,0,0,163, - 164,5,115,0,0,164,165,5,105,0,0,165,166,5,110,0,0,166,12,1,0,0,0, - 167,168,5,99,0,0,168,169,5,111,0,0,169,170,5,115,0,0,170,14,1,0, - 0,0,171,172,5,116,0,0,172,173,5,97,0,0,173,174,5,110,0,0,174,16, - 1,0,0,0,175,176,5,97,0,0,176,177,5,115,0,0,177,178,5,105,0,0,178, - 179,5,110,0,0,179,18,1,0,0,0,180,181,5,97,0,0,181,182,5,99,0,0,182, - 183,5,111,0,0,183,184,5,115,0,0,184,20,1,0,0,0,185,186,5,97,0,0, - 186,187,5,116,0,0,187,188,5,97,0,0,188,189,5,110,0,0,189,22,1,0, - 0,0,190,191,5,97,0,0,191,192,5,116,0,0,192,193,5,97,0,0,193,194, - 5,110,0,0,194,195,5,50,0,0,195,24,1,0,0,0,196,197,5,115,0,0,197, - 198,5,105,0,0,198,199,5,110,0,0,199,200,5,104,0,0,200,26,1,0,0,0, - 201,202,5,99,0,0,202,203,5,111,0,0,203,204,5,115,0,0,204,205,5,104, - 0,0,205,28,1,0,0,0,206,207,5,116,0,0,207,208,5,97,0,0,208,209,5, - 110,0,0,209,210,5,104,0,0,210,30,1,0,0,0,211,212,5,97,0,0,212,213, - 5,115,0,0,213,214,5,105,0,0,214,215,5,110,0,0,215,216,5,104,0,0, - 216,32,1,0,0,0,217,218,5,97,0,0,218,219,5,99,0,0,219,220,5,111,0, - 0,220,221,5,115,0,0,221,222,5,104,0,0,222,34,1,0,0,0,223,224,5,97, - 0,0,224,225,5,116,0,0,225,226,5,97,0,0,226,227,5,110,0,0,227,228, - 5,104,0,0,228,36,1,0,0,0,229,230,5,97,0,0,230,231,5,98,0,0,231,232, - 5,115,0,0,232,38,1,0,0,0,233,234,5,115,0,0,234,235,5,113,0,0,235, - 236,5,114,0,0,236,237,5,116,0,0,237,40,1,0,0,0,238,239,5,108,0,0, - 239,240,5,110,0,0,240,42,1,0,0,0,241,242,5,108,0,0,242,243,5,111, - 0,0,243,244,5,103,0,0,244,44,1,0,0,0,245,246,5,101,0,0,246,247,5, - 120,0,0,247,248,5,112,0,0,248,46,1,0,0,0,249,250,5,115,0,0,250,251, - 5,109,0,0,251,252,5,105,0,0,252,253,5,110,0,0,253,48,1,0,0,0,254, - 255,5,115,0,0,255,256,5,109,0,0,256,257,5,97,0,0,257,258,5,120,0, - 0,258,50,1,0,0,0,259,260,5,116,0,0,260,261,5,109,0,0,261,262,5,105, - 0,0,262,263,5,110,0,0,263,52,1,0,0,0,264,265,5,116,0,0,265,266,5, - 109,0,0,266,267,5,97,0,0,267,268,5,120,0,0,268,54,1,0,0,0,269,270, - 5,116,0,0,270,271,5,110,0,0,271,272,5,111,0,0,272,273,5,114,0,0, - 273,274,5,109,0,0,274,56,1,0,0,0,275,276,5,115,0,0,276,277,5,110, - 0,0,277,278,5,111,0,0,278,279,5,114,0,0,279,280,5,109,0,0,280,58, - 1,0,0,0,281,282,5,102,0,0,282,283,5,108,0,0,283,284,5,111,0,0,284, - 285,5,111,0,0,285,286,5,114,0,0,286,60,1,0,0,0,287,288,5,99,0,0, - 288,289,5,101,0,0,289,290,5,105,0,0,290,291,5,108,0,0,291,62,1,0, - 0,0,292,293,5,114,0,0,293,294,5,111,0,0,294,295,5,117,0,0,295,296, - 5,110,0,0,296,297,5,100,0,0,297,64,1,0,0,0,298,299,5,103,0,0,299, - 300,5,97,0,0,300,301,5,109,0,0,301,302,5,109,0,0,302,303,5,97,0, - 0,303,66,1,0,0,0,304,305,5,112,0,0,305,306,5,111,0,0,306,307,5,119, - 0,0,307,68,1,0,0,0,308,309,5,115,0,0,309,310,5,105,0,0,310,311,5, - 103,0,0,311,312,5,109,0,0,312,70,1,0,0,0,313,314,5,99,0,0,314,315, - 5,108,0,0,315,316,5,97,0,0,316,317,5,109,0,0,317,318,5,112,0,0,318, - 72,1,0,0,0,319,320,5,102,0,0,320,321,5,102,0,0,321,322,5,116,0,0, - 322,74,1,0,0,0,323,324,5,105,0,0,324,325,5,102,0,0,325,326,5,102, - 0,0,326,327,5,116,0,0,327,76,1,0,0,0,328,329,5,97,0,0,329,330,5, - 110,0,0,330,331,5,103,0,0,331,332,5,108,0,0,332,333,5,101,0,0,333, - 78,1,0,0,0,334,335,5,112,0,0,335,336,5,114,0,0,336,337,5,105,0,0, - 337,338,5,110,0,0,338,339,5,116,0,0,339,80,1,0,0,0,340,341,5,112, - 0,0,341,342,5,114,0,0,342,343,5,105,0,0,343,344,5,110,0,0,344,345, - 5,116,0,0,345,346,5,95,0,0,346,347,5,115,0,0,347,348,5,104,0,0,348, - 349,5,97,0,0,349,350,5,112,0,0,350,356,5,101,0,0,351,352,5,112,0, - 0,352,353,5,115,0,0,353,354,5,104,0,0,354,356,5,112,0,0,355,340, - 1,0,0,0,355,351,1,0,0,0,356,82,1,0,0,0,357,358,5,108,0,0,358,359, - 5,101,0,0,359,360,5,114,0,0,360,361,5,112,0,0,361,84,1,0,0,0,362, - 363,5,115,0,0,363,364,5,116,0,0,364,365,5,101,0,0,365,366,5,112, - 0,0,366,86,1,0,0,0,367,368,5,115,0,0,368,369,5,109,0,0,369,370,5, - 111,0,0,370,371,5,111,0,0,371,372,5,116,0,0,372,373,5,104,0,0,373, - 374,5,115,0,0,374,375,5,116,0,0,375,376,5,101,0,0,376,377,5,112, - 0,0,377,88,1,0,0,0,378,379,5,102,0,0,379,380,5,114,0,0,380,381,5, - 97,0,0,381,382,5,99,0,0,382,383,5,116,0,0,383,90,1,0,0,0,384,385, - 5,114,0,0,385,386,5,101,0,0,386,387,5,108,0,0,387,388,5,117,0,0, - 388,92,1,0,0,0,389,390,5,115,0,0,390,391,5,111,0,0,391,392,5,102, - 0,0,392,393,5,116,0,0,393,394,5,112,0,0,394,395,5,108,0,0,395,396, - 5,117,0,0,396,397,5,115,0,0,397,94,1,0,0,0,398,399,5,103,0,0,399, - 400,5,101,0,0,400,401,5,108,0,0,401,402,5,117,0,0,402,96,1,0,0,0, - 403,404,5,115,0,0,404,405,5,105,0,0,405,406,5,103,0,0,406,407,5, - 110,0,0,407,98,1,0,0,0,408,409,5,109,0,0,409,410,5,97,0,0,410,411, - 5,112,0,0,411,100,1,0,0,0,412,413,5,101,0,0,413,414,5,122,0,0,414, - 415,5,99,0,0,415,416,5,111,0,0,416,417,5,110,0,0,417,418,5,118,0, - 0,418,419,5,111,0,0,419,420,5,108,0,0,420,421,5,117,0,0,421,422, - 5,116,0,0,422,423,5,105,0,0,423,424,5,111,0,0,424,432,5,110,0,0, - 425,426,5,101,0,0,426,427,5,122,0,0,427,428,5,99,0,0,428,429,5,111, - 0,0,429,430,5,110,0,0,430,432,5,118,0,0,431,412,1,0,0,0,431,425, - 1,0,0,0,432,102,1,0,0,0,433,434,5,99,0,0,434,435,5,111,0,0,435,436, - 5,110,0,0,436,437,5,118,0,0,437,438,5,111,0,0,438,439,5,108,0,0, - 439,440,5,117,0,0,440,441,5,116,0,0,441,442,5,105,0,0,442,443,5, - 111,0,0,443,449,5,110,0,0,444,445,5,99,0,0,445,446,5,111,0,0,446, - 447,5,110,0,0,447,449,5,118,0,0,448,433,1,0,0,0,448,444,1,0,0,0, - 449,104,1,0,0,0,450,451,5,115,0,0,451,452,5,119,0,0,452,453,5,97, - 0,0,453,454,5,112,0,0,454,106,1,0,0,0,455,456,5,112,0,0,456,457, - 5,101,0,0,457,458,5,114,0,0,458,459,5,109,0,0,459,460,5,117,0,0, - 460,461,5,116,0,0,461,467,5,101,0,0,462,463,5,112,0,0,463,464,5, - 101,0,0,464,465,5,114,0,0,465,467,5,109,0,0,466,455,1,0,0,0,466, - 462,1,0,0,0,467,108,1,0,0,0,468,469,5,114,0,0,469,470,5,101,0,0, - 470,471,5,115,0,0,471,472,5,104,0,0,472,473,5,97,0,0,473,474,5,112, - 0,0,474,480,5,101,0,0,475,476,5,114,0,0,476,477,5,115,0,0,477,478, - 5,104,0,0,478,480,5,112,0,0,479,468,1,0,0,0,479,475,1,0,0,0,480, - 110,1,0,0,0,481,482,5,114,0,0,482,483,5,97,0,0,483,484,5,110,0,0, - 484,485,5,103,0,0,485,486,5,101,0,0,486,112,1,0,0,0,487,488,5,116, - 0,0,488,489,5,111,0,0,489,490,5,112,0,0,490,491,5,107,0,0,491,114, - 1,0,0,0,492,493,5,98,0,0,493,494,5,111,0,0,494,495,5,116,0,0,495, - 496,5,107,0,0,496,116,1,0,0,0,497,498,5,112,0,0,498,499,5,105,0, - 0,499,500,5,110,0,0,500,501,5,118,0,0,501,118,1,0,0,0,502,503,5, - 43,0,0,503,120,1,0,0,0,504,505,5,45,0,0,505,122,1,0,0,0,506,507, - 5,42,0,0,507,124,1,0,0,0,508,509,5,47,0,0,509,126,1,0,0,0,510,511, - 5,37,0,0,511,128,1,0,0,0,512,513,5,94,0,0,513,130,1,0,0,0,514,515, - 5,62,0,0,515,516,5,61,0,0,516,132,1,0,0,0,517,518,5,62,0,0,518,134, - 1,0,0,0,519,520,5,60,0,0,520,521,5,61,0,0,521,136,1,0,0,0,522,523, - 5,60,0,0,523,138,1,0,0,0,524,525,5,61,0,0,525,526,5,61,0,0,526,140, - 1,0,0,0,527,528,5,33,0,0,528,529,5,61,0,0,529,142,1,0,0,0,530,531, - 5,124,0,0,531,144,1,0,0,0,532,533,5,112,0,0,533,538,5,105,0,0,534, - 535,5,80,0,0,535,538,5,73,0,0,536,538,7,0,0,0,537,532,1,0,0,0,537, - 534,1,0,0,0,537,536,1,0,0,0,538,146,1,0,0,0,539,541,7,1,0,0,540, - 539,1,0,0,0,541,542,1,0,0,0,542,540,1,0,0,0,542,543,1,0,0,0,543, - 550,1,0,0,0,544,546,5,46,0,0,545,547,7,1,0,0,546,545,1,0,0,0,547, - 548,1,0,0,0,548,546,1,0,0,0,548,549,1,0,0,0,549,551,1,0,0,0,550, - 544,1,0,0,0,550,551,1,0,0,0,551,148,1,0,0,0,552,556,7,2,0,0,553, - 555,7,3,0,0,554,553,1,0,0,0,555,558,1,0,0,0,556,554,1,0,0,0,556, - 557,1,0,0,0,557,150,1,0,0,0,558,556,1,0,0,0,559,561,7,4,0,0,560, - 559,1,0,0,0,561,562,1,0,0,0,562,560,1,0,0,0,562,563,1,0,0,0,563, - 564,1,0,0,0,564,565,6,75,0,0,565,152,1,0,0,0,12,0,355,431,448,466, - 479,537,542,548,550,556,562,1,6,0,0 + 71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77,2, + 78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,1,0,1,0,1,0,1,0, + 1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4, + 1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7, + 1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1, + 10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1, + 12,1,12,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1, + 15,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1, + 18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,21,1,21,1, + 21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1, + 23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1, + 26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1, + 28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1, + 30,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1, + 33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,3,35,360,8, + 35,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1, + 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1, + 39,1,39,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1, + 41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1, + 44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1, + 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,436,8,45,1, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1, + 46,1,46,3,46,453,8,46,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1, + 48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,3,48,471,8,48,1,49,1,49,1, + 49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,3,49,484,8,49,1,50,1, + 50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1, + 52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1, + 55,1,55,1,55,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,58,1,58,1, + 58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,548,8,59,1,60,1, + 60,1,60,1,60,1,61,1,61,1,62,1,62,1,63,1,63,1,64,1,64,1,65,1,65,1, + 66,1,66,1,67,1,67,1,67,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,71,1, + 71,1,71,1,72,1,72,1,72,1,73,1,73,1,74,1,74,1,75,1,75,1,76,1,76,1, + 77,1,77,1,78,1,78,1,79,1,79,1,79,1,79,1,79,3,79,599,8,79,1,80,4, + 80,602,8,80,11,80,12,80,603,1,80,1,80,4,80,608,8,80,11,80,12,80, + 609,3,80,612,8,80,1,81,1,81,5,81,616,8,81,10,81,12,81,619,9,81,1, + 82,4,82,622,8,82,11,82,12,82,623,1,82,1,82,0,0,83,1,1,3,2,5,3,7, + 4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31, + 16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53, + 27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75, + 38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97, + 49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,58, + 117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67,135, + 68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153,77, + 155,78,157,79,159,80,161,81,163,82,165,83,1,0,5,2,0,69,69,101,101, + 1,0,48,57,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,3, + 0,9,10,13,13,32,32,639,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1, + 0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1, + 0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1, + 0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1, + 0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1, + 0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1, + 0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1, + 0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1, + 0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1, + 0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1, + 0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107, + 1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0, + 0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1, + 0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0, + 135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0, + 0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153, + 1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0, + 0,163,1,0,0,0,0,165,1,0,0,0,1,167,1,0,0,0,3,171,1,0,0,0,5,175,1, + 0,0,0,7,179,1,0,0,0,9,184,1,0,0,0,11,189,1,0,0,0,13,194,1,0,0,0, + 15,200,1,0,0,0,17,205,1,0,0,0,19,210,1,0,0,0,21,215,1,0,0,0,23,221, + 1,0,0,0,25,227,1,0,0,0,27,233,1,0,0,0,29,237,1,0,0,0,31,242,1,0, + 0,0,33,245,1,0,0,0,35,249,1,0,0,0,37,253,1,0,0,0,39,258,1,0,0,0, + 41,263,1,0,0,0,43,268,1,0,0,0,45,273,1,0,0,0,47,279,1,0,0,0,49,285, + 1,0,0,0,51,291,1,0,0,0,53,296,1,0,0,0,55,302,1,0,0,0,57,308,1,0, + 0,0,59,312,1,0,0,0,61,317,1,0,0,0,63,323,1,0,0,0,65,327,1,0,0,0, + 67,332,1,0,0,0,69,338,1,0,0,0,71,359,1,0,0,0,73,361,1,0,0,0,75,366, + 1,0,0,0,77,371,1,0,0,0,79,382,1,0,0,0,81,388,1,0,0,0,83,393,1,0, + 0,0,85,402,1,0,0,0,87,407,1,0,0,0,89,412,1,0,0,0,91,435,1,0,0,0, + 93,452,1,0,0,0,95,454,1,0,0,0,97,470,1,0,0,0,99,483,1,0,0,0,101, + 485,1,0,0,0,103,491,1,0,0,0,105,496,1,0,0,0,107,501,1,0,0,0,109, + 506,1,0,0,0,111,510,1,0,0,0,113,515,1,0,0,0,115,519,1,0,0,0,117, + 523,1,0,0,0,119,547,1,0,0,0,121,549,1,0,0,0,123,553,1,0,0,0,125, + 555,1,0,0,0,127,557,1,0,0,0,129,559,1,0,0,0,131,561,1,0,0,0,133, + 563,1,0,0,0,135,565,1,0,0,0,137,568,1,0,0,0,139,570,1,0,0,0,141, + 573,1,0,0,0,143,575,1,0,0,0,145,578,1,0,0,0,147,581,1,0,0,0,149, + 583,1,0,0,0,151,585,1,0,0,0,153,587,1,0,0,0,155,589,1,0,0,0,157, + 591,1,0,0,0,159,598,1,0,0,0,161,601,1,0,0,0,163,613,1,0,0,0,165, + 621,1,0,0,0,167,168,5,115,0,0,168,169,5,105,0,0,169,170,5,110,0, + 0,170,2,1,0,0,0,171,172,5,99,0,0,172,173,5,111,0,0,173,174,5,115, + 0,0,174,4,1,0,0,0,175,176,5,116,0,0,176,177,5,97,0,0,177,178,5,110, + 0,0,178,6,1,0,0,0,179,180,5,97,0,0,180,181,5,115,0,0,181,182,5,105, + 0,0,182,183,5,110,0,0,183,8,1,0,0,0,184,185,5,97,0,0,185,186,5,99, + 0,0,186,187,5,111,0,0,187,188,5,115,0,0,188,10,1,0,0,0,189,190,5, + 97,0,0,190,191,5,116,0,0,191,192,5,97,0,0,192,193,5,110,0,0,193, + 12,1,0,0,0,194,195,5,97,0,0,195,196,5,116,0,0,196,197,5,97,0,0,197, + 198,5,110,0,0,198,199,5,50,0,0,199,14,1,0,0,0,200,201,5,115,0,0, + 201,202,5,105,0,0,202,203,5,110,0,0,203,204,5,104,0,0,204,16,1,0, + 0,0,205,206,5,99,0,0,206,207,5,111,0,0,207,208,5,115,0,0,208,209, + 5,104,0,0,209,18,1,0,0,0,210,211,5,116,0,0,211,212,5,97,0,0,212, + 213,5,110,0,0,213,214,5,104,0,0,214,20,1,0,0,0,215,216,5,97,0,0, + 216,217,5,115,0,0,217,218,5,105,0,0,218,219,5,110,0,0,219,220,5, + 104,0,0,220,22,1,0,0,0,221,222,5,97,0,0,222,223,5,99,0,0,223,224, + 5,111,0,0,224,225,5,115,0,0,225,226,5,104,0,0,226,24,1,0,0,0,227, + 228,5,97,0,0,228,229,5,116,0,0,229,230,5,97,0,0,230,231,5,110,0, + 0,231,232,5,104,0,0,232,26,1,0,0,0,233,234,5,97,0,0,234,235,5,98, + 0,0,235,236,5,115,0,0,236,28,1,0,0,0,237,238,5,115,0,0,238,239,5, + 113,0,0,239,240,5,114,0,0,240,241,5,116,0,0,241,30,1,0,0,0,242,243, + 5,108,0,0,243,244,5,110,0,0,244,32,1,0,0,0,245,246,5,108,0,0,246, + 247,5,111,0,0,247,248,5,103,0,0,248,34,1,0,0,0,249,250,5,101,0,0, + 250,251,5,120,0,0,251,252,5,112,0,0,252,36,1,0,0,0,253,254,5,115, + 0,0,254,255,5,109,0,0,255,256,5,105,0,0,256,257,5,110,0,0,257,38, + 1,0,0,0,258,259,5,115,0,0,259,260,5,109,0,0,260,261,5,97,0,0,261, + 262,5,120,0,0,262,40,1,0,0,0,263,264,5,116,0,0,264,265,5,109,0,0, + 265,266,5,105,0,0,266,267,5,110,0,0,267,42,1,0,0,0,268,269,5,116, + 0,0,269,270,5,109,0,0,270,271,5,97,0,0,271,272,5,120,0,0,272,44, + 1,0,0,0,273,274,5,116,0,0,274,275,5,110,0,0,275,276,5,111,0,0,276, + 277,5,114,0,0,277,278,5,109,0,0,278,46,1,0,0,0,279,280,5,115,0,0, + 280,281,5,110,0,0,281,282,5,111,0,0,282,283,5,114,0,0,283,284,5, + 109,0,0,284,48,1,0,0,0,285,286,5,102,0,0,286,287,5,108,0,0,287,288, + 5,111,0,0,288,289,5,111,0,0,289,290,5,114,0,0,290,50,1,0,0,0,291, + 292,5,99,0,0,292,293,5,101,0,0,293,294,5,105,0,0,294,295,5,108,0, + 0,295,52,1,0,0,0,296,297,5,114,0,0,297,298,5,111,0,0,298,299,5,117, + 0,0,299,300,5,110,0,0,300,301,5,100,0,0,301,54,1,0,0,0,302,303,5, + 103,0,0,303,304,5,97,0,0,304,305,5,109,0,0,305,306,5,109,0,0,306, + 307,5,97,0,0,307,56,1,0,0,0,308,309,5,112,0,0,309,310,5,111,0,0, + 310,311,5,119,0,0,311,58,1,0,0,0,312,313,5,115,0,0,313,314,5,105, + 0,0,314,315,5,103,0,0,315,316,5,109,0,0,316,60,1,0,0,0,317,318,5, + 99,0,0,318,319,5,108,0,0,319,320,5,97,0,0,320,321,5,109,0,0,321, + 322,5,112,0,0,322,62,1,0,0,0,323,324,5,102,0,0,324,325,5,102,0,0, + 325,326,5,116,0,0,326,64,1,0,0,0,327,328,5,105,0,0,328,329,5,102, + 0,0,329,330,5,102,0,0,330,331,5,116,0,0,331,66,1,0,0,0,332,333,5, + 97,0,0,333,334,5,110,0,0,334,335,5,103,0,0,335,336,5,108,0,0,336, + 337,5,101,0,0,337,68,1,0,0,0,338,339,5,112,0,0,339,340,5,114,0,0, + 340,341,5,105,0,0,341,342,5,110,0,0,342,343,5,116,0,0,343,70,1,0, + 0,0,344,345,5,112,0,0,345,346,5,114,0,0,346,347,5,105,0,0,347,348, + 5,110,0,0,348,349,5,116,0,0,349,350,5,95,0,0,350,351,5,115,0,0,351, + 352,5,104,0,0,352,353,5,97,0,0,353,354,5,112,0,0,354,360,5,101,0, + 0,355,356,5,112,0,0,356,357,5,115,0,0,357,358,5,104,0,0,358,360, + 5,112,0,0,359,344,1,0,0,0,359,355,1,0,0,0,360,72,1,0,0,0,361,362, + 5,108,0,0,362,363,5,101,0,0,363,364,5,114,0,0,364,365,5,112,0,0, + 365,74,1,0,0,0,366,367,5,115,0,0,367,368,5,116,0,0,368,369,5,101, + 0,0,369,370,5,112,0,0,370,76,1,0,0,0,371,372,5,115,0,0,372,373,5, + 109,0,0,373,374,5,111,0,0,374,375,5,111,0,0,375,376,5,116,0,0,376, + 377,5,104,0,0,377,378,5,115,0,0,378,379,5,116,0,0,379,380,5,101, + 0,0,380,381,5,112,0,0,381,78,1,0,0,0,382,383,5,102,0,0,383,384,5, + 114,0,0,384,385,5,97,0,0,385,386,5,99,0,0,386,387,5,116,0,0,387, + 80,1,0,0,0,388,389,5,114,0,0,389,390,5,101,0,0,390,391,5,108,0,0, + 391,392,5,117,0,0,392,82,1,0,0,0,393,394,5,115,0,0,394,395,5,111, + 0,0,395,396,5,102,0,0,396,397,5,116,0,0,397,398,5,112,0,0,398,399, + 5,108,0,0,399,400,5,117,0,0,400,401,5,115,0,0,401,84,1,0,0,0,402, + 403,5,103,0,0,403,404,5,101,0,0,404,405,5,108,0,0,405,406,5,117, + 0,0,406,86,1,0,0,0,407,408,5,115,0,0,408,409,5,105,0,0,409,410,5, + 103,0,0,410,411,5,110,0,0,411,88,1,0,0,0,412,413,5,109,0,0,413,414, + 5,97,0,0,414,415,5,112,0,0,415,90,1,0,0,0,416,417,5,101,0,0,417, + 418,5,122,0,0,418,419,5,99,0,0,419,420,5,111,0,0,420,421,5,110,0, + 0,421,422,5,118,0,0,422,423,5,111,0,0,423,424,5,108,0,0,424,425, + 5,117,0,0,425,426,5,116,0,0,426,427,5,105,0,0,427,428,5,111,0,0, + 428,436,5,110,0,0,429,430,5,101,0,0,430,431,5,122,0,0,431,432,5, + 99,0,0,432,433,5,111,0,0,433,434,5,110,0,0,434,436,5,118,0,0,435, + 416,1,0,0,0,435,429,1,0,0,0,436,92,1,0,0,0,437,438,5,99,0,0,438, + 439,5,111,0,0,439,440,5,110,0,0,440,441,5,118,0,0,441,442,5,111, + 0,0,442,443,5,108,0,0,443,444,5,117,0,0,444,445,5,116,0,0,445,446, + 5,105,0,0,446,447,5,111,0,0,447,453,5,110,0,0,448,449,5,99,0,0,449, + 450,5,111,0,0,450,451,5,110,0,0,451,453,5,118,0,0,452,437,1,0,0, + 0,452,448,1,0,0,0,453,94,1,0,0,0,454,455,5,115,0,0,455,456,5,119, + 0,0,456,457,5,97,0,0,457,458,5,112,0,0,458,96,1,0,0,0,459,460,5, + 112,0,0,460,461,5,101,0,0,461,462,5,114,0,0,462,463,5,109,0,0,463, + 464,5,117,0,0,464,465,5,116,0,0,465,471,5,101,0,0,466,467,5,112, + 0,0,467,468,5,101,0,0,468,469,5,114,0,0,469,471,5,109,0,0,470,459, + 1,0,0,0,470,466,1,0,0,0,471,98,1,0,0,0,472,473,5,114,0,0,473,474, + 5,101,0,0,474,475,5,115,0,0,475,476,5,104,0,0,476,477,5,97,0,0,477, + 478,5,112,0,0,478,484,5,101,0,0,479,480,5,114,0,0,480,481,5,115, + 0,0,481,482,5,104,0,0,482,484,5,112,0,0,483,472,1,0,0,0,483,479, + 1,0,0,0,484,100,1,0,0,0,485,486,5,114,0,0,486,487,5,97,0,0,487,488, + 5,110,0,0,488,489,5,103,0,0,489,490,5,101,0,0,490,102,1,0,0,0,491, + 492,5,116,0,0,492,493,5,111,0,0,493,494,5,112,0,0,494,495,5,107, + 0,0,495,104,1,0,0,0,496,497,5,98,0,0,497,498,5,111,0,0,498,499,5, + 116,0,0,499,500,5,107,0,0,500,106,1,0,0,0,501,502,5,112,0,0,502, + 503,5,105,0,0,503,504,5,110,0,0,504,505,5,118,0,0,505,108,1,0,0, + 0,506,507,5,115,0,0,507,508,5,117,0,0,508,509,5,109,0,0,509,110, + 1,0,0,0,510,511,5,109,0,0,511,512,5,101,0,0,512,513,5,97,0,0,513, + 514,5,110,0,0,514,112,1,0,0,0,515,516,5,115,0,0,516,517,5,116,0, + 0,517,518,5,100,0,0,518,114,1,0,0,0,519,520,5,118,0,0,520,521,5, + 97,0,0,521,522,5,114,0,0,522,116,1,0,0,0,523,524,5,113,0,0,524,525, + 5,117,0,0,525,526,5,97,0,0,526,527,5,114,0,0,527,528,5,116,0,0,528, + 529,5,105,0,0,529,530,5,108,0,0,530,531,5,101,0,0,531,118,1,0,0, + 0,532,533,5,112,0,0,533,534,5,101,0,0,534,535,5,114,0,0,535,536, + 5,99,0,0,536,537,5,101,0,0,537,538,5,110,0,0,538,539,5,116,0,0,539, + 540,5,105,0,0,540,541,5,108,0,0,541,548,5,101,0,0,542,543,5,112, + 0,0,543,544,5,114,0,0,544,545,5,99,0,0,545,546,5,110,0,0,546,548, + 5,116,0,0,547,532,1,0,0,0,547,542,1,0,0,0,548,120,1,0,0,0,549,550, + 5,100,0,0,550,551,5,111,0,0,551,552,5,116,0,0,552,122,1,0,0,0,553, + 554,5,43,0,0,554,124,1,0,0,0,555,556,5,45,0,0,556,126,1,0,0,0,557, + 558,5,42,0,0,558,128,1,0,0,0,559,560,5,47,0,0,560,130,1,0,0,0,561, + 562,5,37,0,0,562,132,1,0,0,0,563,564,5,94,0,0,564,134,1,0,0,0,565, + 566,5,62,0,0,566,567,5,61,0,0,567,136,1,0,0,0,568,569,5,62,0,0,569, + 138,1,0,0,0,570,571,5,60,0,0,571,572,5,61,0,0,572,140,1,0,0,0,573, + 574,5,60,0,0,574,142,1,0,0,0,575,576,5,61,0,0,576,577,5,61,0,0,577, + 144,1,0,0,0,578,579,5,33,0,0,579,580,5,61,0,0,580,146,1,0,0,0,581, + 582,5,124,0,0,582,148,1,0,0,0,583,584,5,40,0,0,584,150,1,0,0,0,585, + 586,5,41,0,0,586,152,1,0,0,0,587,588,5,44,0,0,588,154,1,0,0,0,589, + 590,5,91,0,0,590,156,1,0,0,0,591,592,5,93,0,0,592,158,1,0,0,0,593, + 594,5,112,0,0,594,599,5,105,0,0,595,596,5,80,0,0,596,599,5,73,0, + 0,597,599,7,0,0,0,598,593,1,0,0,0,598,595,1,0,0,0,598,597,1,0,0, + 0,599,160,1,0,0,0,600,602,7,1,0,0,601,600,1,0,0,0,602,603,1,0,0, + 0,603,601,1,0,0,0,603,604,1,0,0,0,604,611,1,0,0,0,605,607,5,46,0, + 0,606,608,7,1,0,0,607,606,1,0,0,0,608,609,1,0,0,0,609,607,1,0,0, + 0,609,610,1,0,0,0,610,612,1,0,0,0,611,605,1,0,0,0,611,612,1,0,0, + 0,612,162,1,0,0,0,613,617,7,2,0,0,614,616,7,3,0,0,615,614,1,0,0, + 0,616,619,1,0,0,0,617,615,1,0,0,0,617,618,1,0,0,0,618,164,1,0,0, + 0,619,617,1,0,0,0,620,622,7,4,0,0,621,620,1,0,0,0,622,623,1,0,0, + 0,623,621,1,0,0,0,623,624,1,0,0,0,624,625,1,0,0,0,625,626,6,82,0, + 0,626,166,1,0,0,0,13,0,359,435,452,470,483,547,598,603,609,611,617, + 623,1,6,0,0 ] class MathExprLexer(Lexer): @@ -218,98 +240,106 @@ class MathExprLexer(Lexer): decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ] - T__0 = 1 - T__1 = 2 - T__2 = 3 - T__3 = 4 - T__4 = 5 - SIN = 6 - COS = 7 - TAN = 8 - ASIN = 9 - ACOS = 10 - ATAN = 11 - ATAN2 = 12 - SINH = 13 - COSH = 14 - TANH = 15 - ASINH = 16 - ACOSH = 17 - ATANH = 18 - ABS = 19 - SQRT = 20 - LN = 21 - LOG = 22 - EXP = 23 - SMIN = 24 - SMAX = 25 - TMIN = 26 - TMAX = 27 - TNORM = 28 - SNORM = 29 - FLOOR = 30 - CEIL = 31 - ROUND = 32 - GAMMA = 33 - POWE = 34 - SIGM = 35 - CLAMP = 36 - SFFT = 37 - SIFFT = 38 - ANGL = 39 - PRNT = 40 - PRINT_SHAPE = 41 - LERP = 42 - STEP = 43 - SMOOTHSTEP = 44 - FRACT = 45 - RELU = 46 - SOFTPLUS = 47 - GELU = 48 - SIGN = 49 - MAP = 50 - EZCONV = 51 - CONV = 52 - SWAP = 53 - PERM = 54 - RESHAPE = 55 - RANGE = 56 - TOPK = 57 - BOTK = 58 - PINV = 59 - PLUS = 60 - MINUS = 61 - MULT = 62 - DIV = 63 - MOD = 64 - POW = 65 - GE = 66 - GT = 67 - LE = 68 - LT = 69 - EQ = 70 - NE = 71 - PIPE = 72 - CONSTANT = 73 - NUMBER = 74 - VARIABLE = 75 - WS = 76 + SIN = 1 + COS = 2 + TAN = 3 + ASIN = 4 + ACOS = 5 + ATAN = 6 + ATAN2 = 7 + SINH = 8 + COSH = 9 + TANH = 10 + ASINH = 11 + ACOSH = 12 + ATANH = 13 + ABS = 14 + SQRT = 15 + LN = 16 + LOG = 17 + EXP = 18 + SMIN = 19 + SMAX = 20 + TMIN = 21 + TMAX = 22 + TNORM = 23 + SNORM = 24 + FLOOR = 25 + CEIL = 26 + ROUND = 27 + GAMMA = 28 + POWE = 29 + SIGM = 30 + CLAMP = 31 + SFFT = 32 + SIFFT = 33 + ANGL = 34 + PRNT = 35 + PRINT_SHAPE = 36 + LERP = 37 + STEP = 38 + SMOOTHSTEP = 39 + FRACT = 40 + RELU = 41 + SOFTPLUS = 42 + GELU = 43 + SIGN = 44 + MAP = 45 + EZCONV = 46 + CONV = 47 + SWAP = 48 + PERM = 49 + RESHAPE = 50 + RANGE = 51 + TOPK = 52 + BOTK = 53 + PINV = 54 + SUM = 55 + MEAN = 56 + STD = 57 + VAR = 58 + QUARTILE = 59 + PERCENTILE = 60 + DOT = 61 + PLUS = 62 + MINUS = 63 + MULT = 64 + DIV = 65 + MOD = 66 + POW = 67 + GE = 68 + GT = 69 + LE = 70 + LT = 71 + EQ = 72 + NE = 73 + PIPE = 74 + LPAREN = 75 + RPAREN = 76 + COMMA = 77 + LBRACKET = 78 + RBRACKET = 79 + CONSTANT = 80 + NUMBER = 81 + VARIABLE = 82 + WS = 83 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] modeNames = [ "DEFAULT_MODE" ] literalNames = [ "", - "'('", "')'", "'['", "','", "']'", "'sin'", "'cos'", "'tan'", - "'asin'", "'acos'", "'atan'", "'atan2'", "'sinh'", "'cosh'", - "'tanh'", "'asinh'", "'acosh'", "'atanh'", "'abs'", "'sqrt'", - "'ln'", "'log'", "'exp'", "'smin'", "'smax'", "'tmin'", "'tmax'", - "'tnorm'", "'snorm'", "'floor'", "'ceil'", "'round'", "'gamma'", - "'pow'", "'sigm'", "'clamp'", "'fft'", "'ifft'", "'angle'", - "'print'", "'lerp'", "'step'", "'smoothstep'", "'fract'", "'relu'", - "'softplus'", "'gelu'", "'sign'", "'map'", "'swap'", "'range'", - "'topk'", "'botk'", "'pinv'", "'+'", "'-'", "'*'", "'/'", "'%'", - "'^'", "'>='", "'>'", "'<='", "'<'", "'=='", "'!='", "'|'" ] + "'sin'", "'cos'", "'tan'", "'asin'", "'acos'", "'atan'", "'atan2'", + "'sinh'", "'cosh'", "'tanh'", "'asinh'", "'acosh'", "'atanh'", + "'abs'", "'sqrt'", "'ln'", "'log'", "'exp'", "'smin'", "'smax'", + "'tmin'", "'tmax'", "'tnorm'", "'snorm'", "'floor'", "'ceil'", + "'round'", "'gamma'", "'pow'", "'sigm'", "'clamp'", "'fft'", + "'ifft'", "'angle'", "'print'", "'lerp'", "'step'", "'smoothstep'", + "'fract'", "'relu'", "'softplus'", "'gelu'", "'sign'", "'map'", + "'swap'", "'range'", "'topk'", "'botk'", "'pinv'", "'sum'", + "'mean'", "'std'", "'var'", "'quartile'", "'dot'", "'+'", "'-'", + "'*'", "'/'", "'%'", "'^'", "'>='", "'>'", "'<='", "'<'", "'=='", + "'!='", "'|'", "'('", "')'", "','", "'['", "']'" ] symbolicNames = [ "", "SIN", "COS", "TAN", "ASIN", "ACOS", "ATAN", "ATAN2", "SINH", @@ -319,21 +349,24 @@ class MathExprLexer(Lexer): "SFFT", "SIFFT", "ANGL", "PRNT", "PRINT_SHAPE", "LERP", "STEP", "SMOOTHSTEP", "FRACT", "RELU", "SOFTPLUS", "GELU", "SIGN", "MAP", "EZCONV", "CONV", "SWAP", "PERM", "RESHAPE", "RANGE", "TOPK", - "BOTK", "PINV", "PLUS", "MINUS", "MULT", "DIV", "MOD", "POW", - "GE", "GT", "LE", "LT", "EQ", "NE", "PIPE", "CONSTANT", "NUMBER", - "VARIABLE", "WS" ] + "BOTK", "PINV", "SUM", "MEAN", "STD", "VAR", "QUARTILE", "PERCENTILE", + "DOT", "PLUS", "MINUS", "MULT", "DIV", "MOD", "POW", "GE", "GT", + "LE", "LT", "EQ", "NE", "PIPE", "LPAREN", "RPAREN", "COMMA", + "LBRACKET", "RBRACKET", "CONSTANT", "NUMBER", "VARIABLE", "WS" ] - ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "SIN", "COS", - "TAN", "ASIN", "ACOS", "ATAN", "ATAN2", "SINH", "COSH", - "TANH", "ASINH", "ACOSH", "ATANH", "ABS", "SQRT", "LN", - "LOG", "EXP", "SMIN", "SMAX", "TMIN", "TMAX", "TNORM", - "SNORM", "FLOOR", "CEIL", "ROUND", "GAMMA", "POWE", "SIGM", - "CLAMP", "SFFT", "SIFFT", "ANGL", "PRNT", "PRINT_SHAPE", + ruleNames = [ "SIN", "COS", "TAN", "ASIN", "ACOS", "ATAN", "ATAN2", + "SINH", "COSH", "TANH", "ASINH", "ACOSH", "ATANH", "ABS", + "SQRT", "LN", "LOG", "EXP", "SMIN", "SMAX", "TMIN", "TMAX", + "TNORM", "SNORM", "FLOOR", "CEIL", "ROUND", "GAMMA", "POWE", + "SIGM", "CLAMP", "SFFT", "SIFFT", "ANGL", "PRNT", "PRINT_SHAPE", "LERP", "STEP", "SMOOTHSTEP", "FRACT", "RELU", "SOFTPLUS", "GELU", "SIGN", "MAP", "EZCONV", "CONV", "SWAP", "PERM", - "RESHAPE", "RANGE", "TOPK", "BOTK", "PINV", "PLUS", "MINUS", - "MULT", "DIV", "MOD", "POW", "GE", "GT", "LE", "LT", "EQ", - "NE", "PIPE", "CONSTANT", "NUMBER", "VARIABLE", "WS" ] + "RESHAPE", "RANGE", "TOPK", "BOTK", "PINV", "SUM", "MEAN", + "STD", "VAR", "QUARTILE", "PERCENTILE", "DOT", "PLUS", + "MINUS", "MULT", "DIV", "MOD", "POW", "GE", "GT", "LE", + "LT", "EQ", "NE", "PIPE", "LPAREN", "RPAREN", "COMMA", + "LBRACKET", "RBRACKET", "CONSTANT", "NUMBER", "VARIABLE", + "WS" ] grammarFileName = "MathExpr.g4" diff --git a/more_math/Parser/MathExprLexer.tokens b/more_math/Parser/MathExprLexer.tokens index ad02869..77e6f06 100644 --- a/more_math/Parser/MathExprLexer.tokens +++ b/more_math/Parser/MathExprLexer.tokens @@ -1,143 +1,156 @@ -T__0=1 -T__1=2 -T__2=3 -T__3=4 -T__4=5 -SIN=6 -COS=7 -TAN=8 -ASIN=9 -ACOS=10 -ATAN=11 -ATAN2=12 -SINH=13 -COSH=14 -TANH=15 -ASINH=16 -ACOSH=17 -ATANH=18 -ABS=19 -SQRT=20 -LN=21 -LOG=22 -EXP=23 -SMIN=24 -SMAX=25 -TMIN=26 -TMAX=27 -TNORM=28 -SNORM=29 -FLOOR=30 -CEIL=31 -ROUND=32 -GAMMA=33 -POWE=34 -SIGM=35 -CLAMP=36 -SFFT=37 -SIFFT=38 -ANGL=39 -PRNT=40 -PRINT_SHAPE=41 -LERP=42 -STEP=43 -SMOOTHSTEP=44 -FRACT=45 -RELU=46 -SOFTPLUS=47 -GELU=48 -SIGN=49 -MAP=50 -EZCONV=51 -CONV=52 -SWAP=53 -PERM=54 -RESHAPE=55 -RANGE=56 -TOPK=57 -BOTK=58 -PINV=59 -PLUS=60 -MINUS=61 -MULT=62 -DIV=63 -MOD=64 -POW=65 -GE=66 -GT=67 -LE=68 -LT=69 -EQ=70 -NE=71 -PIPE=72 -CONSTANT=73 -NUMBER=74 -VARIABLE=75 -WS=76 -'('=1 -')'=2 -'['=3 -','=4 -']'=5 -'sin'=6 -'cos'=7 -'tan'=8 -'asin'=9 -'acos'=10 -'atan'=11 -'atan2'=12 -'sinh'=13 -'cosh'=14 -'tanh'=15 -'asinh'=16 -'acosh'=17 -'atanh'=18 -'abs'=19 -'sqrt'=20 -'ln'=21 -'log'=22 -'exp'=23 -'smin'=24 -'smax'=25 -'tmin'=26 -'tmax'=27 -'tnorm'=28 -'snorm'=29 -'floor'=30 -'ceil'=31 -'round'=32 -'gamma'=33 -'pow'=34 -'sigm'=35 -'clamp'=36 -'fft'=37 -'ifft'=38 -'angle'=39 -'print'=40 -'lerp'=42 -'step'=43 -'smoothstep'=44 -'fract'=45 -'relu'=46 -'softplus'=47 -'gelu'=48 -'sign'=49 -'map'=50 -'swap'=53 -'range'=56 -'topk'=57 -'botk'=58 -'pinv'=59 -'+'=60 -'-'=61 -'*'=62 -'/'=63 -'%'=64 -'^'=65 -'>='=66 -'>'=67 -'<='=68 -'<'=69 -'=='=70 -'!='=71 -'|'=72 +SIN=1 +COS=2 +TAN=3 +ASIN=4 +ACOS=5 +ATAN=6 +ATAN2=7 +SINH=8 +COSH=9 +TANH=10 +ASINH=11 +ACOSH=12 +ATANH=13 +ABS=14 +SQRT=15 +LN=16 +LOG=17 +EXP=18 +SMIN=19 +SMAX=20 +TMIN=21 +TMAX=22 +TNORM=23 +SNORM=24 +FLOOR=25 +CEIL=26 +ROUND=27 +GAMMA=28 +POWE=29 +SIGM=30 +CLAMP=31 +SFFT=32 +SIFFT=33 +ANGL=34 +PRNT=35 +PRINT_SHAPE=36 +LERP=37 +STEP=38 +SMOOTHSTEP=39 +FRACT=40 +RELU=41 +SOFTPLUS=42 +GELU=43 +SIGN=44 +MAP=45 +EZCONV=46 +CONV=47 +SWAP=48 +PERM=49 +RESHAPE=50 +RANGE=51 +TOPK=52 +BOTK=53 +PINV=54 +SUM=55 +MEAN=56 +STD=57 +VAR=58 +QUARTILE=59 +PERCENTILE=60 +DOT=61 +PLUS=62 +MINUS=63 +MULT=64 +DIV=65 +MOD=66 +POW=67 +GE=68 +GT=69 +LE=70 +LT=71 +EQ=72 +NE=73 +PIPE=74 +LPAREN=75 +RPAREN=76 +COMMA=77 +LBRACKET=78 +RBRACKET=79 +CONSTANT=80 +NUMBER=81 +VARIABLE=82 +WS=83 +'sin'=1 +'cos'=2 +'tan'=3 +'asin'=4 +'acos'=5 +'atan'=6 +'atan2'=7 +'sinh'=8 +'cosh'=9 +'tanh'=10 +'asinh'=11 +'acosh'=12 +'atanh'=13 +'abs'=14 +'sqrt'=15 +'ln'=16 +'log'=17 +'exp'=18 +'smin'=19 +'smax'=20 +'tmin'=21 +'tmax'=22 +'tnorm'=23 +'snorm'=24 +'floor'=25 +'ceil'=26 +'round'=27 +'gamma'=28 +'pow'=29 +'sigm'=30 +'clamp'=31 +'fft'=32 +'ifft'=33 +'angle'=34 +'print'=35 +'lerp'=37 +'step'=38 +'smoothstep'=39 +'fract'=40 +'relu'=41 +'softplus'=42 +'gelu'=43 +'sign'=44 +'map'=45 +'swap'=48 +'range'=51 +'topk'=52 +'botk'=53 +'pinv'=54 +'sum'=55 +'mean'=56 +'std'=57 +'var'=58 +'quartile'=59 +'dot'=61 +'+'=62 +'-'=63 +'*'=64 +'/'=65 +'%'=66 +'^'=67 +'>='=68 +'>'=69 +'<='=70 +'<'=71 +'=='=72 +'!='=73 +'|'=74 +'('=75 +')'=76 +','=77 +'['=78 +']'=79 diff --git a/more_math/Parser/MathExprListener.py b/more_math/Parser/MathExprListener.py index 1d6a38f..27b5f00 100644 --- a/more_math/Parser/MathExprListener.py +++ b/more_math/Parser/MathExprListener.py @@ -602,6 +602,42 @@ class MathExprListener(ParseTreeListener): pass + # Enter a parse tree produced by MathExprParser#SumFunc. + def enterSumFunc(self, ctx:MathExprParser.SumFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#SumFunc. + def exitSumFunc(self, ctx:MathExprParser.SumFuncContext): + pass + + + # Enter a parse tree produced by MathExprParser#MeanFunc. + def enterMeanFunc(self, ctx:MathExprParser.MeanFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#MeanFunc. + def exitMeanFunc(self, ctx:MathExprParser.MeanFuncContext): + pass + + + # Enter a parse tree produced by MathExprParser#StdFunc. + def enterStdFunc(self, ctx:MathExprParser.StdFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#StdFunc. + def exitStdFunc(self, ctx:MathExprParser.StdFuncContext): + pass + + + # Enter a parse tree produced by MathExprParser#VarFunc. + def enterVarFunc(self, ctx:MathExprParser.VarFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#VarFunc. + def exitVarFunc(self, ctx:MathExprParser.VarFuncContext): + pass + + # Enter a parse tree produced by MathExprParser#PowFunc. def enterPowFunc(self, ctx:MathExprParser.PowFuncContext): pass @@ -665,6 +701,33 @@ class MathExprListener(ParseTreeListener): pass + # Enter a parse tree produced by MathExprParser#QuartileFunc. + def enterQuartileFunc(self, ctx:MathExprParser.QuartileFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#QuartileFunc. + def exitQuartileFunc(self, ctx:MathExprParser.QuartileFuncContext): + pass + + + # Enter a parse tree produced by MathExprParser#PercentileFunc. + def enterPercentileFunc(self, ctx:MathExprParser.PercentileFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#PercentileFunc. + def exitPercentileFunc(self, ctx:MathExprParser.PercentileFuncContext): + pass + + + # Enter a parse tree produced by MathExprParser#DotFunc. + def enterDotFunc(self, ctx:MathExprParser.DotFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#DotFunc. + def exitDotFunc(self, ctx:MathExprParser.DotFuncContext): + pass + + # Enter a parse tree produced by MathExprParser#ClampFunc. def enterClampFunc(self, ctx:MathExprParser.ClampFuncContext): pass @@ -737,6 +800,15 @@ class MathExprListener(ParseTreeListener): pass + # Enter a parse tree produced by MathExprParser#EzConvFunc. + def enterEzConvFunc(self, ctx:MathExprParser.EzConvFuncContext): + pass + + # Exit a parse tree produced by MathExprParser#EzConvFunc. + def exitEzConvFunc(self, ctx:MathExprParser.EzConvFuncContext): + pass + + # Enter a parse tree produced by MathExprParser#ConvFunc. def enterConvFunc(self, ctx:MathExprParser.ConvFuncContext): pass diff --git a/more_math/Parser/MathExprParser.py b/more_math/Parser/MathExprParser.py index 6964189..44265c2 100644 --- a/more_math/Parser/MathExprParser.py +++ b/more_math/Parser/MathExprParser.py @@ -1,4 +1,4 @@ -# Generated from MathExpr.g4 by ANTLR 4.13.2 +# Generated from ./MathExpr.g4 by ANTLR 4.13.2 # encoding: utf-8 from antlr4 import * from io import StringIO @@ -10,7 +10,7 @@ else: def serializedATN(): return [ - 4,1,76,479,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, + 4,1,83,520,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, 6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,1,0,1,0,3,0,27,8,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,5,1,50,8,1,10,1,12,1,53,9,1,1,2,1,2,1,2,1,2, @@ -29,156 +29,171 @@ def serializedATN(): 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, - 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,3,7,304, - 8,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, + 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,7,3,7,324,8,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, - 1,8,1,8,3,8,355,8,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, + 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, + 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,3,8,396,8,8,1,9,1,9, 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, - 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,393,8,9,1,10,1,10,1,10,1, - 10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,5, - 11,411,8,11,10,11,12,11,414,9,11,1,11,1,11,1,11,1,11,1,11,1,11,1, - 11,5,11,423,8,11,10,11,12,11,426,9,11,1,11,1,11,1,11,1,11,1,11,1, - 11,1,11,4,11,435,8,11,11,11,12,11,436,1,11,1,11,1,11,1,11,1,11,1, - 11,1,11,4,11,446,8,11,11,11,12,11,447,1,11,1,11,1,11,1,11,1,11,1, - 11,1,11,4,11,457,8,11,11,11,12,11,458,1,11,1,11,1,11,1,11,1,11,1, - 11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11,477,8, - 11,1,11,0,3,2,4,6,12,0,2,4,6,8,10,12,14,16,18,20,22,0,0,546,0,26, - 1,0,0,0,2,28,1,0,0,0,4,54,1,0,0,0,6,68,1,0,0,0,8,90,1,0,0,0,10,97, - 1,0,0,0,12,126,1,0,0,0,14,303,1,0,0,0,16,354,1,0,0,0,18,392,1,0, - 0,0,20,394,1,0,0,0,22,476,1,0,0,0,24,27,3,12,6,0,25,27,3,2,1,0,26, - 24,1,0,0,0,26,25,1,0,0,0,27,1,1,0,0,0,28,29,6,1,-1,0,29,30,3,4,2, - 0,30,51,1,0,0,0,31,32,10,7,0,0,32,33,5,67,0,0,33,50,3,4,2,0,34,35, - 10,6,0,0,35,36,5,66,0,0,36,50,3,4,2,0,37,38,10,5,0,0,38,39,5,69, - 0,0,39,50,3,4,2,0,40,41,10,4,0,0,41,42,5,68,0,0,42,50,3,4,2,0,43, - 44,10,3,0,0,44,45,5,70,0,0,45,50,3,4,2,0,46,47,10,2,0,0,47,48,5, - 71,0,0,48,50,3,4,2,0,49,31,1,0,0,0,49,34,1,0,0,0,49,37,1,0,0,0,49, - 40,1,0,0,0,49,43,1,0,0,0,49,46,1,0,0,0,50,53,1,0,0,0,51,49,1,0,0, - 0,51,52,1,0,0,0,52,3,1,0,0,0,53,51,1,0,0,0,54,55,6,2,-1,0,55,56, - 3,6,3,0,56,65,1,0,0,0,57,58,10,3,0,0,58,59,5,60,0,0,59,64,3,6,3, - 0,60,61,10,2,0,0,61,62,5,61,0,0,62,64,3,6,3,0,63,57,1,0,0,0,63,60, - 1,0,0,0,64,67,1,0,0,0,65,63,1,0,0,0,65,66,1,0,0,0,66,5,1,0,0,0,67, - 65,1,0,0,0,68,69,6,3,-1,0,69,70,3,8,4,0,70,82,1,0,0,0,71,72,10,4, - 0,0,72,73,5,62,0,0,73,81,3,8,4,0,74,75,10,3,0,0,75,76,5,63,0,0,76, - 81,3,8,4,0,77,78,10,2,0,0,78,79,5,64,0,0,79,81,3,8,4,0,80,71,1,0, - 0,0,80,74,1,0,0,0,80,77,1,0,0,0,81,84,1,0,0,0,82,80,1,0,0,0,82,83, - 1,0,0,0,83,7,1,0,0,0,84,82,1,0,0,0,85,86,3,10,5,0,86,87,5,65,0,0, - 87,88,3,8,4,0,88,91,1,0,0,0,89,91,3,10,5,0,90,85,1,0,0,0,90,89,1, - 0,0,0,91,9,1,0,0,0,92,93,5,60,0,0,93,98,3,10,5,0,94,95,5,61,0,0, - 95,98,3,10,5,0,96,98,3,12,6,0,97,92,1,0,0,0,97,94,1,0,0,0,97,96, - 1,0,0,0,98,11,1,0,0,0,99,127,3,14,7,0,100,127,3,16,8,0,101,127,3, - 18,9,0,102,127,3,20,10,0,103,127,3,22,11,0,104,127,5,75,0,0,105, - 127,5,74,0,0,106,127,5,73,0,0,107,108,5,1,0,0,108,109,3,0,0,0,109, - 110,5,2,0,0,110,127,1,0,0,0,111,112,5,72,0,0,112,113,3,0,0,0,113, - 114,5,72,0,0,114,127,1,0,0,0,115,116,5,3,0,0,116,121,3,0,0,0,117, - 118,5,4,0,0,118,120,3,0,0,0,119,117,1,0,0,0,120,123,1,0,0,0,121, - 119,1,0,0,0,121,122,1,0,0,0,122,124,1,0,0,0,123,121,1,0,0,0,124, - 125,5,5,0,0,125,127,1,0,0,0,126,99,1,0,0,0,126,100,1,0,0,0,126,101, - 1,0,0,0,126,102,1,0,0,0,126,103,1,0,0,0,126,104,1,0,0,0,126,105, - 1,0,0,0,126,106,1,0,0,0,126,107,1,0,0,0,126,111,1,0,0,0,126,115, - 1,0,0,0,127,13,1,0,0,0,128,129,5,6,0,0,129,130,5,1,0,0,130,131,3, - 0,0,0,131,132,5,2,0,0,132,304,1,0,0,0,133,134,5,7,0,0,134,135,5, - 1,0,0,135,136,3,0,0,0,136,137,5,2,0,0,137,304,1,0,0,0,138,139,5, - 8,0,0,139,140,5,1,0,0,140,141,3,0,0,0,141,142,5,2,0,0,142,304,1, - 0,0,0,143,144,5,9,0,0,144,145,5,1,0,0,145,146,3,0,0,0,146,147,5, - 2,0,0,147,304,1,0,0,0,148,149,5,10,0,0,149,150,5,1,0,0,150,151,3, - 0,0,0,151,152,5,2,0,0,152,304,1,0,0,0,153,154,5,11,0,0,154,155,5, - 1,0,0,155,156,3,0,0,0,156,157,5,2,0,0,157,304,1,0,0,0,158,159,5, - 13,0,0,159,160,5,1,0,0,160,161,3,0,0,0,161,162,5,2,0,0,162,304,1, - 0,0,0,163,164,5,14,0,0,164,165,5,1,0,0,165,166,3,0,0,0,166,167,5, - 2,0,0,167,304,1,0,0,0,168,169,5,15,0,0,169,170,5,1,0,0,170,171,3, - 0,0,0,171,172,5,2,0,0,172,304,1,0,0,0,173,174,5,16,0,0,174,175,5, - 1,0,0,175,176,3,0,0,0,176,177,5,2,0,0,177,304,1,0,0,0,178,179,5, - 17,0,0,179,180,5,1,0,0,180,181,3,0,0,0,181,182,5,2,0,0,182,304,1, - 0,0,0,183,184,5,18,0,0,184,185,5,1,0,0,185,186,3,0,0,0,186,187,5, - 2,0,0,187,304,1,0,0,0,188,189,5,19,0,0,189,190,5,1,0,0,190,191,3, - 0,0,0,191,192,5,2,0,0,192,304,1,0,0,0,193,194,5,20,0,0,194,195,5, - 1,0,0,195,196,3,0,0,0,196,197,5,2,0,0,197,304,1,0,0,0,198,199,5, - 21,0,0,199,200,5,1,0,0,200,201,3,0,0,0,201,202,5,2,0,0,202,304,1, - 0,0,0,203,204,5,22,0,0,204,205,5,1,0,0,205,206,3,0,0,0,206,207,5, - 2,0,0,207,304,1,0,0,0,208,209,5,23,0,0,209,210,5,1,0,0,210,211,3, - 0,0,0,211,212,5,2,0,0,212,304,1,0,0,0,213,214,5,28,0,0,214,215,5, - 1,0,0,215,216,3,0,0,0,216,217,5,2,0,0,217,304,1,0,0,0,218,219,5, - 29,0,0,219,220,5,1,0,0,220,221,3,0,0,0,221,222,5,2,0,0,222,304,1, - 0,0,0,223,224,5,30,0,0,224,225,5,1,0,0,225,226,3,0,0,0,226,227,5, - 2,0,0,227,304,1,0,0,0,228,229,5,31,0,0,229,230,5,1,0,0,230,231,3, - 0,0,0,231,232,5,2,0,0,232,304,1,0,0,0,233,234,5,32,0,0,234,235,5, - 1,0,0,235,236,3,0,0,0,236,237,5,2,0,0,237,304,1,0,0,0,238,239,5, - 33,0,0,239,240,5,1,0,0,240,241,3,0,0,0,241,242,5,2,0,0,242,304,1, - 0,0,0,243,244,5,35,0,0,244,245,5,1,0,0,245,246,3,0,0,0,246,247,5, - 2,0,0,247,304,1,0,0,0,248,249,5,37,0,0,249,250,5,1,0,0,250,251,3, - 0,0,0,251,252,5,2,0,0,252,304,1,0,0,0,253,254,5,38,0,0,254,255,5, - 1,0,0,255,256,3,0,0,0,256,257,5,2,0,0,257,304,1,0,0,0,258,259,5, - 39,0,0,259,260,5,1,0,0,260,261,3,0,0,0,261,262,5,2,0,0,262,304,1, - 0,0,0,263,264,5,40,0,0,264,265,5,1,0,0,265,266,3,0,0,0,266,267,5, - 2,0,0,267,304,1,0,0,0,268,269,5,45,0,0,269,270,5,1,0,0,270,271,3, - 0,0,0,271,272,5,2,0,0,272,304,1,0,0,0,273,274,5,46,0,0,274,275,5, - 1,0,0,275,276,3,0,0,0,276,277,5,2,0,0,277,304,1,0,0,0,278,279,5, - 47,0,0,279,280,5,1,0,0,280,281,3,0,0,0,281,282,5,2,0,0,282,304,1, - 0,0,0,283,284,5,48,0,0,284,285,5,1,0,0,285,286,3,0,0,0,286,287,5, - 2,0,0,287,304,1,0,0,0,288,289,5,49,0,0,289,290,5,1,0,0,290,291,3, - 0,0,0,291,292,5,2,0,0,292,304,1,0,0,0,293,294,5,41,0,0,294,295,5, - 1,0,0,295,296,3,0,0,0,296,297,5,2,0,0,297,304,1,0,0,0,298,299,5, - 59,0,0,299,300,5,1,0,0,300,301,3,0,0,0,301,302,5,2,0,0,302,304,1, - 0,0,0,303,128,1,0,0,0,303,133,1,0,0,0,303,138,1,0,0,0,303,143,1, - 0,0,0,303,148,1,0,0,0,303,153,1,0,0,0,303,158,1,0,0,0,303,163,1, - 0,0,0,303,168,1,0,0,0,303,173,1,0,0,0,303,178,1,0,0,0,303,183,1, - 0,0,0,303,188,1,0,0,0,303,193,1,0,0,0,303,198,1,0,0,0,303,203,1, - 0,0,0,303,208,1,0,0,0,303,213,1,0,0,0,303,218,1,0,0,0,303,223,1, - 0,0,0,303,228,1,0,0,0,303,233,1,0,0,0,303,238,1,0,0,0,303,243,1, - 0,0,0,303,248,1,0,0,0,303,253,1,0,0,0,303,258,1,0,0,0,303,263,1, - 0,0,0,303,268,1,0,0,0,303,273,1,0,0,0,303,278,1,0,0,0,303,283,1, - 0,0,0,303,288,1,0,0,0,303,293,1,0,0,0,303,298,1,0,0,0,304,15,1,0, - 0,0,305,306,5,34,0,0,306,307,5,1,0,0,307,308,3,0,0,0,308,309,5,4, - 0,0,309,310,3,0,0,0,310,311,5,2,0,0,311,355,1,0,0,0,312,313,5,12, - 0,0,313,314,5,1,0,0,314,315,3,0,0,0,315,316,5,4,0,0,316,317,3,0, - 0,0,317,318,5,2,0,0,318,355,1,0,0,0,319,320,5,26,0,0,320,321,5,1, - 0,0,321,322,3,0,0,0,322,323,5,4,0,0,323,324,3,0,0,0,324,325,5,2, - 0,0,325,355,1,0,0,0,326,327,5,27,0,0,327,328,5,1,0,0,328,329,3,0, - 0,0,329,330,5,4,0,0,330,331,3,0,0,0,331,332,5,2,0,0,332,355,1,0, - 0,0,333,334,5,43,0,0,334,335,5,1,0,0,335,336,3,0,0,0,336,337,5,4, - 0,0,337,338,3,0,0,0,338,339,5,2,0,0,339,355,1,0,0,0,340,341,5,57, - 0,0,341,342,5,1,0,0,342,343,3,0,0,0,343,344,5,4,0,0,344,345,3,0, - 0,0,345,346,5,2,0,0,346,355,1,0,0,0,347,348,5,58,0,0,348,349,5,1, - 0,0,349,350,3,0,0,0,350,351,5,4,0,0,351,352,3,0,0,0,352,353,5,2, - 0,0,353,355,1,0,0,0,354,305,1,0,0,0,354,312,1,0,0,0,354,319,1,0, - 0,0,354,326,1,0,0,0,354,333,1,0,0,0,354,340,1,0,0,0,354,347,1,0, - 0,0,355,17,1,0,0,0,356,357,5,36,0,0,357,358,5,1,0,0,358,359,3,0, - 0,0,359,360,5,4,0,0,360,361,3,0,0,0,361,362,5,4,0,0,362,363,3,0, - 0,0,363,364,5,2,0,0,364,393,1,0,0,0,365,366,5,42,0,0,366,367,5,1, - 0,0,367,368,3,0,0,0,368,369,5,4,0,0,369,370,3,0,0,0,370,371,5,4, - 0,0,371,372,3,0,0,0,372,373,5,2,0,0,373,393,1,0,0,0,374,375,5,44, - 0,0,375,376,5,1,0,0,376,377,3,0,0,0,377,378,5,4,0,0,378,379,3,0, - 0,0,379,380,5,4,0,0,380,381,3,0,0,0,381,382,5,2,0,0,382,393,1,0, - 0,0,383,384,5,56,0,0,384,385,5,1,0,0,385,386,3,0,0,0,386,387,5,4, - 0,0,387,388,3,0,0,0,388,389,5,4,0,0,389,390,3,0,0,0,390,391,5,2, - 0,0,391,393,1,0,0,0,392,356,1,0,0,0,392,365,1,0,0,0,392,374,1,0, - 0,0,392,383,1,0,0,0,393,19,1,0,0,0,394,395,5,53,0,0,395,396,5,1, - 0,0,396,397,3,0,0,0,397,398,5,4,0,0,398,399,3,0,0,0,399,400,5,4, - 0,0,400,401,3,0,0,0,401,402,5,4,0,0,402,403,3,0,0,0,403,404,5,2, - 0,0,404,21,1,0,0,0,405,406,5,24,0,0,406,407,5,1,0,0,407,412,3,0, - 0,0,408,409,5,4,0,0,409,411,3,0,0,0,410,408,1,0,0,0,411,414,1,0, - 0,0,412,410,1,0,0,0,412,413,1,0,0,0,413,415,1,0,0,0,414,412,1,0, - 0,0,415,416,5,2,0,0,416,477,1,0,0,0,417,418,5,25,0,0,418,419,5,1, - 0,0,419,424,3,0,0,0,420,421,5,4,0,0,421,423,3,0,0,0,422,420,1,0, - 0,0,423,426,1,0,0,0,424,422,1,0,0,0,424,425,1,0,0,0,425,427,1,0, - 0,0,426,424,1,0,0,0,427,428,5,2,0,0,428,477,1,0,0,0,429,430,5,50, - 0,0,430,431,5,1,0,0,431,434,3,0,0,0,432,433,5,4,0,0,433,435,3,0, - 0,0,434,432,1,0,0,0,435,436,1,0,0,0,436,434,1,0,0,0,436,437,1,0, - 0,0,437,438,1,0,0,0,438,439,5,2,0,0,439,477,1,0,0,0,440,441,5,51, - 0,0,441,442,5,1,0,0,442,445,3,0,0,0,443,444,5,4,0,0,444,446,3,0, - 0,0,445,443,1,0,0,0,446,447,1,0,0,0,447,445,1,0,0,0,447,448,1,0, - 0,0,448,449,1,0,0,0,449,450,5,2,0,0,450,477,1,0,0,0,451,452,5,52, - 0,0,452,453,5,1,0,0,453,456,3,0,0,0,454,455,5,4,0,0,455,457,3,0, - 0,0,456,454,1,0,0,0,457,458,1,0,0,0,458,456,1,0,0,0,458,459,1,0, - 0,0,459,460,1,0,0,0,460,461,5,2,0,0,461,477,1,0,0,0,462,463,5,54, - 0,0,463,464,5,1,0,0,464,465,3,0,0,0,465,466,5,4,0,0,466,467,3,0, - 0,0,467,468,5,2,0,0,468,477,1,0,0,0,469,470,5,55,0,0,470,471,5,1, - 0,0,471,472,3,0,0,0,472,473,5,4,0,0,473,474,3,0,0,0,474,475,5,2, - 0,0,475,477,1,0,0,0,476,405,1,0,0,0,476,417,1,0,0,0,476,429,1,0, - 0,0,476,440,1,0,0,0,476,451,1,0,0,0,476,462,1,0,0,0,476,469,1,0, - 0,0,477,23,1,0,0,0,20,26,49,51,63,65,80,82,90,97,121,126,303,354, - 392,412,424,436,447,458,476 + 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, + 1,9,1,9,3,9,434,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,11,1,11,1,11,1,11,1,11,5,11,452,8,11,10,11,12,11,455, + 9,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,5,11,464,8,11,10,11,12,11, + 467,9,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,4,11,476,8,11,11,11, + 12,11,477,1,11,1,11,1,11,1,11,1,11,1,11,1,11,4,11,487,8,11,11,11, + 12,11,488,1,11,1,11,1,11,1,11,1,11,1,11,1,11,4,11,498,8,11,11,11, + 12,11,499,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,3,11,518,8,11,1,11,0,3,2,4,6,12,0,2,4,6, + 8,10,12,14,16,18,20,22,0,0,594,0,26,1,0,0,0,2,28,1,0,0,0,4,54,1, + 0,0,0,6,68,1,0,0,0,8,90,1,0,0,0,10,97,1,0,0,0,12,126,1,0,0,0,14, + 323,1,0,0,0,16,395,1,0,0,0,18,433,1,0,0,0,20,435,1,0,0,0,22,517, + 1,0,0,0,24,27,3,12,6,0,25,27,3,2,1,0,26,24,1,0,0,0,26,25,1,0,0,0, + 27,1,1,0,0,0,28,29,6,1,-1,0,29,30,3,4,2,0,30,51,1,0,0,0,31,32,10, + 7,0,0,32,33,5,69,0,0,33,50,3,4,2,0,34,35,10,6,0,0,35,36,5,68,0,0, + 36,50,3,4,2,0,37,38,10,5,0,0,38,39,5,71,0,0,39,50,3,4,2,0,40,41, + 10,4,0,0,41,42,5,70,0,0,42,50,3,4,2,0,43,44,10,3,0,0,44,45,5,72, + 0,0,45,50,3,4,2,0,46,47,10,2,0,0,47,48,5,73,0,0,48,50,3,4,2,0,49, + 31,1,0,0,0,49,34,1,0,0,0,49,37,1,0,0,0,49,40,1,0,0,0,49,43,1,0,0, + 0,49,46,1,0,0,0,50,53,1,0,0,0,51,49,1,0,0,0,51,52,1,0,0,0,52,3,1, + 0,0,0,53,51,1,0,0,0,54,55,6,2,-1,0,55,56,3,6,3,0,56,65,1,0,0,0,57, + 58,10,3,0,0,58,59,5,62,0,0,59,64,3,6,3,0,60,61,10,2,0,0,61,62,5, + 63,0,0,62,64,3,6,3,0,63,57,1,0,0,0,63,60,1,0,0,0,64,67,1,0,0,0,65, + 63,1,0,0,0,65,66,1,0,0,0,66,5,1,0,0,0,67,65,1,0,0,0,68,69,6,3,-1, + 0,69,70,3,8,4,0,70,82,1,0,0,0,71,72,10,4,0,0,72,73,5,64,0,0,73,81, + 3,8,4,0,74,75,10,3,0,0,75,76,5,65,0,0,76,81,3,8,4,0,77,78,10,2,0, + 0,78,79,5,66,0,0,79,81,3,8,4,0,80,71,1,0,0,0,80,74,1,0,0,0,80,77, + 1,0,0,0,81,84,1,0,0,0,82,80,1,0,0,0,82,83,1,0,0,0,83,7,1,0,0,0,84, + 82,1,0,0,0,85,86,3,10,5,0,86,87,5,67,0,0,87,88,3,8,4,0,88,91,1,0, + 0,0,89,91,3,10,5,0,90,85,1,0,0,0,90,89,1,0,0,0,91,9,1,0,0,0,92,93, + 5,62,0,0,93,98,3,10,5,0,94,95,5,63,0,0,95,98,3,10,5,0,96,98,3,12, + 6,0,97,92,1,0,0,0,97,94,1,0,0,0,97,96,1,0,0,0,98,11,1,0,0,0,99,127, + 3,14,7,0,100,127,3,16,8,0,101,127,3,18,9,0,102,127,3,20,10,0,103, + 127,3,22,11,0,104,127,5,82,0,0,105,127,5,81,0,0,106,127,5,80,0,0, + 107,108,5,75,0,0,108,109,3,0,0,0,109,110,5,76,0,0,110,127,1,0,0, + 0,111,112,5,74,0,0,112,113,3,0,0,0,113,114,5,74,0,0,114,127,1,0, + 0,0,115,116,5,78,0,0,116,121,3,0,0,0,117,118,5,77,0,0,118,120,3, + 0,0,0,119,117,1,0,0,0,120,123,1,0,0,0,121,119,1,0,0,0,121,122,1, + 0,0,0,122,124,1,0,0,0,123,121,1,0,0,0,124,125,5,79,0,0,125,127,1, + 0,0,0,126,99,1,0,0,0,126,100,1,0,0,0,126,101,1,0,0,0,126,102,1,0, + 0,0,126,103,1,0,0,0,126,104,1,0,0,0,126,105,1,0,0,0,126,106,1,0, + 0,0,126,107,1,0,0,0,126,111,1,0,0,0,126,115,1,0,0,0,127,13,1,0,0, + 0,128,129,5,1,0,0,129,130,5,75,0,0,130,131,3,0,0,0,131,132,5,76, + 0,0,132,324,1,0,0,0,133,134,5,2,0,0,134,135,5,75,0,0,135,136,3,0, + 0,0,136,137,5,76,0,0,137,324,1,0,0,0,138,139,5,3,0,0,139,140,5,75, + 0,0,140,141,3,0,0,0,141,142,5,76,0,0,142,324,1,0,0,0,143,144,5,4, + 0,0,144,145,5,75,0,0,145,146,3,0,0,0,146,147,5,76,0,0,147,324,1, + 0,0,0,148,149,5,5,0,0,149,150,5,75,0,0,150,151,3,0,0,0,151,152,5, + 76,0,0,152,324,1,0,0,0,153,154,5,6,0,0,154,155,5,75,0,0,155,156, + 3,0,0,0,156,157,5,76,0,0,157,324,1,0,0,0,158,159,5,8,0,0,159,160, + 5,75,0,0,160,161,3,0,0,0,161,162,5,76,0,0,162,324,1,0,0,0,163,164, + 5,9,0,0,164,165,5,75,0,0,165,166,3,0,0,0,166,167,5,76,0,0,167,324, + 1,0,0,0,168,169,5,10,0,0,169,170,5,75,0,0,170,171,3,0,0,0,171,172, + 5,76,0,0,172,324,1,0,0,0,173,174,5,11,0,0,174,175,5,75,0,0,175,176, + 3,0,0,0,176,177,5,76,0,0,177,324,1,0,0,0,178,179,5,12,0,0,179,180, + 5,75,0,0,180,181,3,0,0,0,181,182,5,76,0,0,182,324,1,0,0,0,183,184, + 5,13,0,0,184,185,5,75,0,0,185,186,3,0,0,0,186,187,5,76,0,0,187,324, + 1,0,0,0,188,189,5,14,0,0,189,190,5,75,0,0,190,191,3,0,0,0,191,192, + 5,76,0,0,192,324,1,0,0,0,193,194,5,15,0,0,194,195,5,75,0,0,195,196, + 3,0,0,0,196,197,5,76,0,0,197,324,1,0,0,0,198,199,5,16,0,0,199,200, + 5,75,0,0,200,201,3,0,0,0,201,202,5,76,0,0,202,324,1,0,0,0,203,204, + 5,17,0,0,204,205,5,75,0,0,205,206,3,0,0,0,206,207,5,76,0,0,207,324, + 1,0,0,0,208,209,5,18,0,0,209,210,5,75,0,0,210,211,3,0,0,0,211,212, + 5,76,0,0,212,324,1,0,0,0,213,214,5,23,0,0,214,215,5,75,0,0,215,216, + 3,0,0,0,216,217,5,76,0,0,217,324,1,0,0,0,218,219,5,24,0,0,219,220, + 5,75,0,0,220,221,3,0,0,0,221,222,5,76,0,0,222,324,1,0,0,0,223,224, + 5,25,0,0,224,225,5,75,0,0,225,226,3,0,0,0,226,227,5,76,0,0,227,324, + 1,0,0,0,228,229,5,26,0,0,229,230,5,75,0,0,230,231,3,0,0,0,231,232, + 5,76,0,0,232,324,1,0,0,0,233,234,5,27,0,0,234,235,5,75,0,0,235,236, + 3,0,0,0,236,237,5,76,0,0,237,324,1,0,0,0,238,239,5,28,0,0,239,240, + 5,75,0,0,240,241,3,0,0,0,241,242,5,76,0,0,242,324,1,0,0,0,243,244, + 5,30,0,0,244,245,5,75,0,0,245,246,3,0,0,0,246,247,5,76,0,0,247,324, + 1,0,0,0,248,249,5,32,0,0,249,250,5,75,0,0,250,251,3,0,0,0,251,252, + 5,76,0,0,252,324,1,0,0,0,253,254,5,33,0,0,254,255,5,75,0,0,255,256, + 3,0,0,0,256,257,5,76,0,0,257,324,1,0,0,0,258,259,5,34,0,0,259,260, + 5,75,0,0,260,261,3,0,0,0,261,262,5,76,0,0,262,324,1,0,0,0,263,264, + 5,35,0,0,264,265,5,75,0,0,265,266,3,0,0,0,266,267,5,76,0,0,267,324, + 1,0,0,0,268,269,5,40,0,0,269,270,5,75,0,0,270,271,3,0,0,0,271,272, + 5,76,0,0,272,324,1,0,0,0,273,274,5,41,0,0,274,275,5,75,0,0,275,276, + 3,0,0,0,276,277,5,76,0,0,277,324,1,0,0,0,278,279,5,42,0,0,279,280, + 5,75,0,0,280,281,3,0,0,0,281,282,5,76,0,0,282,324,1,0,0,0,283,284, + 5,43,0,0,284,285,5,75,0,0,285,286,3,0,0,0,286,287,5,76,0,0,287,324, + 1,0,0,0,288,289,5,44,0,0,289,290,5,75,0,0,290,291,3,0,0,0,291,292, + 5,76,0,0,292,324,1,0,0,0,293,294,5,36,0,0,294,295,5,75,0,0,295,296, + 3,0,0,0,296,297,5,76,0,0,297,324,1,0,0,0,298,299,5,54,0,0,299,300, + 5,75,0,0,300,301,3,0,0,0,301,302,5,76,0,0,302,324,1,0,0,0,303,304, + 5,55,0,0,304,305,5,75,0,0,305,306,3,0,0,0,306,307,5,76,0,0,307,324, + 1,0,0,0,308,309,5,56,0,0,309,310,5,75,0,0,310,311,3,0,0,0,311,312, + 5,76,0,0,312,324,1,0,0,0,313,314,5,57,0,0,314,315,5,75,0,0,315,316, + 3,0,0,0,316,317,5,76,0,0,317,324,1,0,0,0,318,319,5,58,0,0,319,320, + 5,75,0,0,320,321,3,0,0,0,321,322,5,76,0,0,322,324,1,0,0,0,323,128, + 1,0,0,0,323,133,1,0,0,0,323,138,1,0,0,0,323,143,1,0,0,0,323,148, + 1,0,0,0,323,153,1,0,0,0,323,158,1,0,0,0,323,163,1,0,0,0,323,168, + 1,0,0,0,323,173,1,0,0,0,323,178,1,0,0,0,323,183,1,0,0,0,323,188, + 1,0,0,0,323,193,1,0,0,0,323,198,1,0,0,0,323,203,1,0,0,0,323,208, + 1,0,0,0,323,213,1,0,0,0,323,218,1,0,0,0,323,223,1,0,0,0,323,228, + 1,0,0,0,323,233,1,0,0,0,323,238,1,0,0,0,323,243,1,0,0,0,323,248, + 1,0,0,0,323,253,1,0,0,0,323,258,1,0,0,0,323,263,1,0,0,0,323,268, + 1,0,0,0,323,273,1,0,0,0,323,278,1,0,0,0,323,283,1,0,0,0,323,288, + 1,0,0,0,323,293,1,0,0,0,323,298,1,0,0,0,323,303,1,0,0,0,323,308, + 1,0,0,0,323,313,1,0,0,0,323,318,1,0,0,0,324,15,1,0,0,0,325,326,5, + 29,0,0,326,327,5,75,0,0,327,328,3,0,0,0,328,329,5,77,0,0,329,330, + 3,0,0,0,330,331,5,76,0,0,331,396,1,0,0,0,332,333,5,7,0,0,333,334, + 5,75,0,0,334,335,3,0,0,0,335,336,5,77,0,0,336,337,3,0,0,0,337,338, + 5,76,0,0,338,396,1,0,0,0,339,340,5,21,0,0,340,341,5,75,0,0,341,342, + 3,0,0,0,342,343,5,77,0,0,343,344,3,0,0,0,344,345,5,76,0,0,345,396, + 1,0,0,0,346,347,5,22,0,0,347,348,5,75,0,0,348,349,3,0,0,0,349,350, + 5,77,0,0,350,351,3,0,0,0,351,352,5,76,0,0,352,396,1,0,0,0,353,354, + 5,38,0,0,354,355,5,75,0,0,355,356,3,0,0,0,356,357,5,77,0,0,357,358, + 3,0,0,0,358,359,5,76,0,0,359,396,1,0,0,0,360,361,5,52,0,0,361,362, + 5,75,0,0,362,363,3,0,0,0,363,364,5,77,0,0,364,365,3,0,0,0,365,366, + 5,76,0,0,366,396,1,0,0,0,367,368,5,53,0,0,368,369,5,75,0,0,369,370, + 3,0,0,0,370,371,5,77,0,0,371,372,3,0,0,0,372,373,5,76,0,0,373,396, + 1,0,0,0,374,375,5,59,0,0,375,376,5,75,0,0,376,377,3,0,0,0,377,378, + 5,77,0,0,378,379,3,0,0,0,379,380,5,76,0,0,380,396,1,0,0,0,381,382, + 5,60,0,0,382,383,5,75,0,0,383,384,3,0,0,0,384,385,5,77,0,0,385,386, + 3,0,0,0,386,387,5,76,0,0,387,396,1,0,0,0,388,389,5,61,0,0,389,390, + 5,75,0,0,390,391,3,0,0,0,391,392,5,77,0,0,392,393,3,0,0,0,393,394, + 5,76,0,0,394,396,1,0,0,0,395,325,1,0,0,0,395,332,1,0,0,0,395,339, + 1,0,0,0,395,346,1,0,0,0,395,353,1,0,0,0,395,360,1,0,0,0,395,367, + 1,0,0,0,395,374,1,0,0,0,395,381,1,0,0,0,395,388,1,0,0,0,396,17,1, + 0,0,0,397,398,5,31,0,0,398,399,5,75,0,0,399,400,3,0,0,0,400,401, + 5,77,0,0,401,402,3,0,0,0,402,403,5,77,0,0,403,404,3,0,0,0,404,405, + 5,76,0,0,405,434,1,0,0,0,406,407,5,37,0,0,407,408,5,75,0,0,408,409, + 3,0,0,0,409,410,5,77,0,0,410,411,3,0,0,0,411,412,5,77,0,0,412,413, + 3,0,0,0,413,414,5,76,0,0,414,434,1,0,0,0,415,416,5,39,0,0,416,417, + 5,75,0,0,417,418,3,0,0,0,418,419,5,77,0,0,419,420,3,0,0,0,420,421, + 5,77,0,0,421,422,3,0,0,0,422,423,5,76,0,0,423,434,1,0,0,0,424,425, + 5,51,0,0,425,426,5,75,0,0,426,427,3,0,0,0,427,428,5,77,0,0,428,429, + 3,0,0,0,429,430,5,77,0,0,430,431,3,0,0,0,431,432,5,76,0,0,432,434, + 1,0,0,0,433,397,1,0,0,0,433,406,1,0,0,0,433,415,1,0,0,0,433,424, + 1,0,0,0,434,19,1,0,0,0,435,436,5,48,0,0,436,437,5,75,0,0,437,438, + 3,0,0,0,438,439,5,77,0,0,439,440,3,0,0,0,440,441,5,77,0,0,441,442, + 3,0,0,0,442,443,5,77,0,0,443,444,3,0,0,0,444,445,5,76,0,0,445,21, + 1,0,0,0,446,447,5,19,0,0,447,448,5,75,0,0,448,453,3,0,0,0,449,450, + 5,77,0,0,450,452,3,0,0,0,451,449,1,0,0,0,452,455,1,0,0,0,453,451, + 1,0,0,0,453,454,1,0,0,0,454,456,1,0,0,0,455,453,1,0,0,0,456,457, + 5,76,0,0,457,518,1,0,0,0,458,459,5,20,0,0,459,460,5,75,0,0,460,465, + 3,0,0,0,461,462,5,77,0,0,462,464,3,0,0,0,463,461,1,0,0,0,464,467, + 1,0,0,0,465,463,1,0,0,0,465,466,1,0,0,0,466,468,1,0,0,0,467,465, + 1,0,0,0,468,469,5,76,0,0,469,518,1,0,0,0,470,471,5,45,0,0,471,472, + 5,75,0,0,472,475,3,0,0,0,473,474,5,77,0,0,474,476,3,0,0,0,475,473, + 1,0,0,0,476,477,1,0,0,0,477,475,1,0,0,0,477,478,1,0,0,0,478,479, + 1,0,0,0,479,480,5,76,0,0,480,518,1,0,0,0,481,482,5,46,0,0,482,483, + 5,75,0,0,483,486,3,0,0,0,484,485,5,77,0,0,485,487,3,0,0,0,486,484, + 1,0,0,0,487,488,1,0,0,0,488,486,1,0,0,0,488,489,1,0,0,0,489,490, + 1,0,0,0,490,491,5,76,0,0,491,518,1,0,0,0,492,493,5,47,0,0,493,494, + 5,75,0,0,494,497,3,0,0,0,495,496,5,77,0,0,496,498,3,0,0,0,497,495, + 1,0,0,0,498,499,1,0,0,0,499,497,1,0,0,0,499,500,1,0,0,0,500,501, + 1,0,0,0,501,502,5,76,0,0,502,518,1,0,0,0,503,504,5,49,0,0,504,505, + 5,75,0,0,505,506,3,0,0,0,506,507,5,77,0,0,507,508,3,0,0,0,508,509, + 5,76,0,0,509,518,1,0,0,0,510,511,5,50,0,0,511,512,5,75,0,0,512,513, + 3,0,0,0,513,514,5,77,0,0,514,515,3,0,0,0,515,516,5,76,0,0,516,518, + 1,0,0,0,517,446,1,0,0,0,517,458,1,0,0,0,517,470,1,0,0,0,517,481, + 1,0,0,0,517,492,1,0,0,0,517,503,1,0,0,0,517,510,1,0,0,0,518,23,1, + 0,0,0,20,26,49,51,63,65,80,82,90,97,121,126,323,395,433,453,465, + 477,488,499,517 ] class MathExprParser ( Parser ): @@ -191,32 +206,35 @@ class MathExprParser ( Parser ): sharedContextCache = PredictionContextCache() - literalNames = [ "", "'('", "')'", "'['", "','", "']'", "'sin'", - "'cos'", "'tan'", "'asin'", "'acos'", "'atan'", "'atan2'", - "'sinh'", "'cosh'", "'tanh'", "'asinh'", "'acosh'", - "'atanh'", "'abs'", "'sqrt'", "'ln'", "'log'", "'exp'", - "'smin'", "'smax'", "'tmin'", "'tmax'", "'tnorm'", - "'snorm'", "'floor'", "'ceil'", "'round'", "'gamma'", - "'pow'", "'sigm'", "'clamp'", "'fft'", "'ifft'", "'angle'", - "'print'", "", "'lerp'", "'step'", "'smoothstep'", - "'fract'", "'relu'", "'softplus'", "'gelu'", "'sign'", - "'map'", "", "", "'swap'", "", - "", "'range'", "'topk'", "'botk'", "'pinv'", - "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", "'>='", "'>'", - "'<='", "'<'", "'=='", "'!='", "'|'" ] + literalNames = [ "", "'sin'", "'cos'", "'tan'", "'asin'", "'acos'", + "'atan'", "'atan2'", "'sinh'", "'cosh'", "'tanh'", + "'asinh'", "'acosh'", "'atanh'", "'abs'", "'sqrt'", + "'ln'", "'log'", "'exp'", "'smin'", "'smax'", "'tmin'", + "'tmax'", "'tnorm'", "'snorm'", "'floor'", "'ceil'", + "'round'", "'gamma'", "'pow'", "'sigm'", "'clamp'", + "'fft'", "'ifft'", "'angle'", "'print'", "", + "'lerp'", "'step'", "'smoothstep'", "'fract'", "'relu'", + "'softplus'", "'gelu'", "'sign'", "'map'", "", + "", "'swap'", "", "", "'range'", + "'topk'", "'botk'", "'pinv'", "'sum'", "'mean'", "'std'", + "'var'", "'quartile'", "", "'dot'", "'+'", + "'-'", "'*'", "'/'", "'%'", "'^'", "'>='", "'>'", "'<='", + "'<'", "'=='", "'!='", "'|'", "'('", "')'", "','", + "'['", "']'" ] - symbolicNames = [ "", "", "", "", - "", "", "SIN", "COS", "TAN", "ASIN", - "ACOS", "ATAN", "ATAN2", "SINH", "COSH", "TANH", "ASINH", + symbolicNames = [ "", "SIN", "COS", "TAN", "ASIN", "ACOS", + "ATAN", "ATAN2", "SINH", "COSH", "TANH", "ASINH", "ACOSH", "ATANH", "ABS", "SQRT", "LN", "LOG", "EXP", "SMIN", "SMAX", "TMIN", "TMAX", "TNORM", "SNORM", "FLOOR", "CEIL", "ROUND", "GAMMA", "POWE", "SIGM", "CLAMP", "SFFT", "SIFFT", "ANGL", "PRNT", "PRINT_SHAPE", "LERP", "STEP", "SMOOTHSTEP", "FRACT", "RELU", "SOFTPLUS", "GELU", "SIGN", "MAP", "EZCONV", "CONV", "SWAP", "PERM", - "RESHAPE", "RANGE", "TOPK", "BOTK", "PINV", "PLUS", - "MINUS", "MULT", "DIV", "MOD", "POW", "GE", "GT", - "LE", "LT", "EQ", "NE", "PIPE", "CONSTANT", "NUMBER", + "RESHAPE", "RANGE", "TOPK", "BOTK", "PINV", "SUM", + "MEAN", "STD", "VAR", "QUARTILE", "PERCENTILE", "DOT", + "PLUS", "MINUS", "MULT", "DIV", "MOD", "POW", "GE", + "GT", "LE", "LT", "EQ", "NE", "PIPE", "LPAREN", "RPAREN", + "COMMA", "LBRACKET", "RBRACKET", "CONSTANT", "NUMBER", "VARIABLE", "WS" ] RULE_expr = 0 @@ -237,82 +255,89 @@ class MathExprParser ( Parser ): "funcN" ] EOF = Token.EOF - T__0=1 - T__1=2 - T__2=3 - T__3=4 - T__4=5 - SIN=6 - COS=7 - TAN=8 - ASIN=9 - ACOS=10 - ATAN=11 - ATAN2=12 - SINH=13 - COSH=14 - TANH=15 - ASINH=16 - ACOSH=17 - ATANH=18 - ABS=19 - SQRT=20 - LN=21 - LOG=22 - EXP=23 - SMIN=24 - SMAX=25 - TMIN=26 - TMAX=27 - TNORM=28 - SNORM=29 - FLOOR=30 - CEIL=31 - ROUND=32 - GAMMA=33 - POWE=34 - SIGM=35 - CLAMP=36 - SFFT=37 - SIFFT=38 - ANGL=39 - PRNT=40 - PRINT_SHAPE=41 - LERP=42 - STEP=43 - SMOOTHSTEP=44 - FRACT=45 - RELU=46 - SOFTPLUS=47 - GELU=48 - SIGN=49 - MAP=50 - EZCONV=51 - CONV=52 - SWAP=53 - PERM=54 - RESHAPE=55 - RANGE=56 - TOPK=57 - BOTK=58 - PINV=59 - PLUS=60 - MINUS=61 - MULT=62 - DIV=63 - MOD=64 - POW=65 - GE=66 - GT=67 - LE=68 - LT=69 - EQ=70 - NE=71 - PIPE=72 - CONSTANT=73 - NUMBER=74 - VARIABLE=75 - WS=76 + SIN=1 + COS=2 + TAN=3 + ASIN=4 + ACOS=5 + ATAN=6 + ATAN2=7 + SINH=8 + COSH=9 + TANH=10 + ASINH=11 + ACOSH=12 + ATANH=13 + ABS=14 + SQRT=15 + LN=16 + LOG=17 + EXP=18 + SMIN=19 + SMAX=20 + TMIN=21 + TMAX=22 + TNORM=23 + SNORM=24 + FLOOR=25 + CEIL=26 + ROUND=27 + GAMMA=28 + POWE=29 + SIGM=30 + CLAMP=31 + SFFT=32 + SIFFT=33 + ANGL=34 + PRNT=35 + PRINT_SHAPE=36 + LERP=37 + STEP=38 + SMOOTHSTEP=39 + FRACT=40 + RELU=41 + SOFTPLUS=42 + GELU=43 + SIGN=44 + MAP=45 + EZCONV=46 + CONV=47 + SWAP=48 + PERM=49 + RESHAPE=50 + RANGE=51 + TOPK=52 + BOTK=53 + PINV=54 + SUM=55 + MEAN=56 + STD=57 + VAR=58 + QUARTILE=59 + PERCENTILE=60 + DOT=61 + PLUS=62 + MINUS=63 + MULT=64 + DIV=65 + MOD=66 + POW=67 + GE=68 + GT=69 + LE=70 + LT=71 + EQ=72 + NE=73 + PIPE=74 + LPAREN=75 + RPAREN=76 + COMMA=77 + LBRACKET=78 + RBRACKET=79 + CONSTANT=80 + NUMBER=81 + VARIABLE=82 + WS=83 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -341,6 +366,14 @@ class MathExprParser ( Parser ): def getRuleIndex(self): return MathExprParser.RULE_expr + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpr" ): + listener.enterExpr(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpr" ): + listener.exitExpr(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitExpr" ): return visitor.visitExpr(self) @@ -411,6 +444,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AddExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLtExp" ): + listener.enterLtExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLtExp" ): + listener.exitLtExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitLtExp" ): return visitor.visitLtExp(self) @@ -433,6 +474,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AddExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEqExp" ): + listener.enterEqExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEqExp" ): + listener.exitEqExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitEqExp" ): return visitor.visitEqExp(self) @@ -450,6 +499,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AddExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterToAdd" ): + listener.enterToAdd(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitToAdd" ): + listener.exitToAdd(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitToAdd" ): return visitor.visitToAdd(self) @@ -472,6 +529,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AddExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterGeExp" ): + listener.enterGeExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitGeExp" ): + listener.exitGeExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitGeExp" ): return visitor.visitGeExp(self) @@ -494,6 +559,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AddExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLeExp" ): + listener.enterLeExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLeExp" ): + listener.exitLeExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitLeExp" ): return visitor.visitLeExp(self) @@ -516,6 +589,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AddExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNeExp" ): + listener.enterNeExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNeExp" ): + listener.exitNeExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitNeExp" ): return visitor.visitNeExp(self) @@ -538,6 +619,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AddExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterGtExp" ): + listener.enterGtExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitGtExp" ): + listener.exitGtExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitGtExp" ): return visitor.visitGtExp(self) @@ -696,6 +785,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.MulExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAddExp" ): + listener.enterAddExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAddExp" ): + listener.exitAddExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAddExp" ): return visitor.visitAddExp(self) @@ -713,6 +810,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.MulExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterToMul" ): + listener.enterToMul(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitToMul" ): + listener.exitToMul(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitToMul" ): return visitor.visitToMul(self) @@ -735,6 +840,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.MulExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSubExp" ): + listener.enterSubExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSubExp" ): + listener.exitSubExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSubExp" ): return visitor.visitSubExp(self) @@ -841,6 +954,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.PowExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMulExp" ): + listener.enterMulExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMulExp" ): + listener.exitMulExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitMulExp" ): return visitor.visitMulExp(self) @@ -863,6 +984,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.PowExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterModExp" ): + listener.enterModExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitModExp" ): + listener.exitModExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitModExp" ): return visitor.visitModExp(self) @@ -885,6 +1014,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.PowExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDivExp" ): + listener.enterDivExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDivExp" ): + listener.exitDivExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitDivExp" ): return visitor.visitDivExp(self) @@ -902,6 +1039,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.PowExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterToPow" ): + listener.enterToPow(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitToPow" ): + listener.exitToPow(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitToPow" ): return visitor.visitToPow(self) @@ -1022,6 +1167,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.PowExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPowExp" ): + listener.enterPowExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPowExp" ): + listener.exitPowExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitPowExp" ): return visitor.visitPowExp(self) @@ -1039,6 +1192,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.UnaryExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterToUnary" ): + listener.enterToUnary(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitToUnary" ): + listener.exitToUnary(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitToUnary" ): return visitor.visitToUnary(self) @@ -1112,6 +1273,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.UnaryExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnaryPlus" ): + listener.enterUnaryPlus(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnaryPlus" ): + listener.exitUnaryPlus(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitUnaryPlus" ): return visitor.visitUnaryPlus(self) @@ -1131,6 +1300,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.UnaryExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterUnaryMinus" ): + listener.enterUnaryMinus(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitUnaryMinus" ): + listener.exitUnaryMinus(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitUnaryMinus" ): return visitor.visitUnaryMinus(self) @@ -1148,6 +1325,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.AtomContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterToAtom" ): + listener.enterToAtom(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitToAtom" ): + listener.exitToAtom(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitToAtom" ): return visitor.visitToAtom(self) @@ -1164,7 +1349,7 @@ class MathExprParser ( Parser ): self.state = 97 self._errHandler.sync(self) token = self._input.LA(1) - if token in [60]: + if token in [62]: localctx = MathExprParser.UnaryPlusContext(self, localctx) self.enterOuterAlt(localctx, 1) self.state = 92 @@ -1172,7 +1357,7 @@ class MathExprParser ( Parser ): self.state = 93 self.unaryExpr() pass - elif token in [61]: + elif token in [63]: localctx = MathExprParser.UnaryMinusContext(self, localctx) self.enterOuterAlt(localctx, 2) self.state = 94 @@ -1180,7 +1365,7 @@ class MathExprParser ( Parser ): self.state = 95 self.unaryExpr() pass - elif token in [1, 3, 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, 72, 73, 74, 75]: + elif token in [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, 74, 75, 78, 80, 81, 82]: localctx = MathExprParser.ToAtomContext(self, localctx) self.enterOuterAlt(localctx, 3) self.state = 96 @@ -1225,6 +1410,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.Func4Context,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunc4Exp" ): + listener.enterFunc4Exp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunc4Exp" ): + listener.exitFunc4Exp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitFunc4Exp" ): return visitor.visitFunc4Exp(self) @@ -1242,6 +1435,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.Func2Context,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunc2Exp" ): + listener.enterFunc2Exp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunc2Exp" ): + listener.exitFunc2Exp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitFunc2Exp" ): return visitor.visitFunc2Exp(self) @@ -1258,6 +1459,14 @@ class MathExprParser ( Parser ): def VARIABLE(self): return self.getToken(MathExprParser.VARIABLE, 0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVariableExp" ): + listener.enterVariableExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVariableExp" ): + listener.exitVariableExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitVariableExp" ): return visitor.visitVariableExp(self) @@ -1275,6 +1484,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.Func3Context,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunc3Exp" ): + listener.enterFunc3Exp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunc3Exp" ): + listener.exitFunc3Exp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitFunc3Exp" ): return visitor.visitFunc3Exp(self) @@ -1288,9 +1505,21 @@ class MathExprParser ( Parser ): super().__init__(parser) self.copyFrom(ctx) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterParenExp" ): + listener.enterParenExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitParenExp" ): + listener.exitParenExp(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitParenExp" ): @@ -1308,6 +1537,14 @@ class MathExprParser ( Parser ): def CONSTANT(self): return self.getToken(MathExprParser.CONSTANT, 0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterConstantExp" ): + listener.enterConstantExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitConstantExp" ): + listener.exitConstantExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitConstantExp" ): return visitor.visitConstantExp(self) @@ -1325,6 +1562,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.Func1Context,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFunc1Exp" ): + listener.enterFunc1Exp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFunc1Exp" ): + listener.exitFunc1Exp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitFunc1Exp" ): return visitor.visitFunc1Exp(self) @@ -1342,6 +1587,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.FuncNContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFuncNExp" ): + listener.enterFuncNExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFuncNExp" ): + listener.exitFuncNExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitFuncNExp" ): return visitor.visitFuncNExp(self) @@ -1358,6 +1611,14 @@ class MathExprParser ( Parser ): def NUMBER(self): return self.getToken(MathExprParser.NUMBER, 0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterNumberExp" ): + listener.enterNumberExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitNumberExp" ): + listener.exitNumberExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitNumberExp" ): return visitor.visitNumberExp(self) @@ -1380,6 +1641,14 @@ class MathExprParser ( Parser ): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAbsExp" ): + listener.enterAbsExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAbsExp" ): + listener.exitAbsExp(self) + def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAbsExp" ): return visitor.visitAbsExp(self) @@ -1393,12 +1662,29 @@ class MathExprParser ( Parser ): super().__init__(parser) self.copyFrom(ctx) + def LBRACKET(self): + return self.getToken(MathExprParser.LBRACKET, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def RBRACKET(self): + return self.getToken(MathExprParser.RBRACKET, 0) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterListExp" ): + listener.enterListExp(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitListExp" ): + listener.exitListExp(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitListExp" ): @@ -1417,65 +1703,65 @@ class MathExprParser ( Parser ): self.state = 126 self._errHandler.sync(self) token = self._input.LA(1) - if token in [6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 28, 29, 30, 31, 32, 33, 35, 37, 38, 39, 40, 41, 45, 46, 47, 48, 49, 59]: + if token in [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 23, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 40, 41, 42, 43, 44, 54, 55, 56, 57, 58]: localctx = MathExprParser.Func1ExpContext(self, localctx) self.enterOuterAlt(localctx, 1) self.state = 99 self.func1() pass - elif token in [12, 26, 27, 34, 43, 57, 58]: + elif token in [7, 21, 22, 29, 38, 52, 53, 59, 60, 61]: localctx = MathExprParser.Func2ExpContext(self, localctx) self.enterOuterAlt(localctx, 2) self.state = 100 self.func2() pass - elif token in [36, 42, 44, 56]: + elif token in [31, 37, 39, 51]: localctx = MathExprParser.Func3ExpContext(self, localctx) self.enterOuterAlt(localctx, 3) self.state = 101 self.func3() pass - elif token in [53]: + elif token in [48]: localctx = MathExprParser.Func4ExpContext(self, localctx) self.enterOuterAlt(localctx, 4) self.state = 102 self.func4() pass - elif token in [24, 25, 50, 51, 52, 54, 55]: + elif token in [19, 20, 45, 46, 47, 49, 50]: localctx = MathExprParser.FuncNExpContext(self, localctx) self.enterOuterAlt(localctx, 5) self.state = 103 self.funcN() pass - elif token in [75]: + elif token in [82]: localctx = MathExprParser.VariableExpContext(self, localctx) self.enterOuterAlt(localctx, 6) self.state = 104 self.match(MathExprParser.VARIABLE) pass - elif token in [74]: + elif token in [81]: localctx = MathExprParser.NumberExpContext(self, localctx) self.enterOuterAlt(localctx, 7) self.state = 105 self.match(MathExprParser.NUMBER) pass - elif token in [73]: + elif token in [80]: localctx = MathExprParser.ConstantExpContext(self, localctx) self.enterOuterAlt(localctx, 8) self.state = 106 self.match(MathExprParser.CONSTANT) pass - elif token in [1]: + elif token in [75]: localctx = MathExprParser.ParenExpContext(self, localctx) self.enterOuterAlt(localctx, 9) self.state = 107 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 108 self.expr() self.state = 109 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [72]: + elif token in [74]: localctx = MathExprParser.AbsExpContext(self, localctx) self.enterOuterAlt(localctx, 10) self.state = 111 @@ -1485,19 +1771,19 @@ class MathExprParser ( Parser ): self.state = 113 self.match(MathExprParser.PIPE) pass - elif token in [3]: + elif token in [78]: localctx = MathExprParser.ListExpContext(self, localctx) self.enterOuterAlt(localctx, 11) self.state = 115 - self.match(MathExprParser.T__2) + self.match(MathExprParser.LBRACKET) self.state = 116 self.expr() self.state = 121 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==4: + while _la==77: self.state = 117 - self.match(MathExprParser.T__3) + self.match(MathExprParser.COMMA) self.state = 118 self.expr() self.state = 123 @@ -1505,7 +1791,7 @@ class MathExprParser ( Parser ): _la = self._input.LA(1) self.state = 124 - self.match(MathExprParser.T__4) + self.match(MathExprParser.RBRACKET) pass else: raise NoViableAltException(self) @@ -1544,9 +1830,21 @@ class MathExprParser ( Parser ): def SOFTPLUS(self): return self.getToken(MathExprParser.SOFTPLUS, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSoftplusFunc" ): + listener.enterSoftplusFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSoftplusFunc" ): + listener.exitSoftplusFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSoftplusFunc" ): @@ -1563,9 +1861,21 @@ class MathExprParser ( Parser ): def TANH(self): return self.getToken(MathExprParser.TANH, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTanhFunc" ): + listener.enterTanhFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTanhFunc" ): + listener.exitTanhFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitTanhFunc" ): @@ -1582,9 +1892,21 @@ class MathExprParser ( Parser ): def ACOSH(self): return self.getToken(MathExprParser.ACOSH, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAcoshFunc" ): + listener.enterAcoshFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAcoshFunc" ): + listener.exitAcoshFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAcoshFunc" ): @@ -1601,9 +1923,21 @@ class MathExprParser ( Parser ): def SQRT(self): return self.getToken(MathExprParser.SQRT, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSqrtFunc" ): + listener.enterSqrtFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSqrtFunc" ): + listener.exitSqrtFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSqrtFunc" ): @@ -1620,9 +1954,21 @@ class MathExprParser ( Parser ): def FLOOR(self): return self.getToken(MathExprParser.FLOOR, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFloorFunc" ): + listener.enterFloorFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFloorFunc" ): + listener.exitFloorFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitFloorFunc" ): @@ -1639,9 +1985,21 @@ class MathExprParser ( Parser ): def ROUND(self): return self.getToken(MathExprParser.ROUND, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRoundFunc" ): + listener.enterRoundFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRoundFunc" ): + listener.exitRoundFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitRoundFunc" ): @@ -1650,6 +2008,37 @@ class MathExprParser ( Parser ): return visitor.visitChildren(self) + class MeanFuncContext(Func1Context): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context + super().__init__(parser) + self.copyFrom(ctx) + + def MEAN(self): + return self.getToken(MathExprParser.MEAN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) + def expr(self): + return self.getTypedRuleContext(MathExprParser.ExprContext,0) + + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMeanFunc" ): + listener.enterMeanFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMeanFunc" ): + listener.exitMeanFunc(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitMeanFunc" ): + return visitor.visitMeanFunc(self) + else: + return visitor.visitChildren(self) + + class CeilFuncContext(Func1Context): def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context @@ -1658,9 +2047,21 @@ class MathExprParser ( Parser ): def CEIL(self): return self.getToken(MathExprParser.CEIL, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCeilFunc" ): + listener.enterCeilFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCeilFunc" ): + listener.exitCeilFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitCeilFunc" ): @@ -1677,9 +2078,21 @@ class MathExprParser ( Parser ): def GELU(self): return self.getToken(MathExprParser.GELU, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterGeluFunc" ): + listener.enterGeluFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitGeluFunc" ): + listener.exitGeluFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitGeluFunc" ): @@ -1696,9 +2109,21 @@ class MathExprParser ( Parser ): def PRNT(self): return self.getToken(MathExprParser.PRNT, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPrintFunc" ): + listener.enterPrintFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPrintFunc" ): + listener.exitPrintFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitPrintFunc" ): @@ -1715,9 +2140,21 @@ class MathExprParser ( Parser ): def ABS(self): return self.getToken(MathExprParser.ABS, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAbsFunc" ): + listener.enterAbsFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAbsFunc" ): + listener.exitAbsFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAbsFunc" ): @@ -1734,9 +2171,21 @@ class MathExprParser ( Parser ): def ATAN(self): return self.getToken(MathExprParser.ATAN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAtanFunc" ): + listener.enterAtanFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAtanFunc" ): + listener.exitAtanFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAtanFunc" ): @@ -1753,9 +2202,21 @@ class MathExprParser ( Parser ): def RELU(self): return self.getToken(MathExprParser.RELU, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterReluFunc" ): + listener.enterReluFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitReluFunc" ): + listener.exitReluFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitReluFunc" ): @@ -1772,9 +2233,21 @@ class MathExprParser ( Parser ): def SINH(self): return self.getToken(MathExprParser.SINH, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSinhFunc" ): + listener.enterSinhFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSinhFunc" ): + listener.exitSinhFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSinhFunc" ): @@ -1791,9 +2264,21 @@ class MathExprParser ( Parser ): def SIGM(self): return self.getToken(MathExprParser.SIGM, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSigmoidFunc" ): + listener.enterSigmoidFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSigmoidFunc" ): + listener.exitSigmoidFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSigmoidFunc" ): @@ -1810,9 +2295,21 @@ class MathExprParser ( Parser ): def LOG(self): return self.getToken(MathExprParser.LOG, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLogFunc" ): + listener.enterLogFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLogFunc" ): + listener.exitLogFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitLogFunc" ): @@ -1829,9 +2326,21 @@ class MathExprParser ( Parser ): def LN(self): return self.getToken(MathExprParser.LN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLnFunc" ): + listener.enterLnFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLnFunc" ): + listener.exitLnFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitLnFunc" ): @@ -1848,9 +2357,21 @@ class MathExprParser ( Parser ): def TNORM(self): return self.getToken(MathExprParser.TNORM, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTNormFunc" ): + listener.enterTNormFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTNormFunc" ): + listener.exitTNormFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitTNormFunc" ): @@ -1867,9 +2388,21 @@ class MathExprParser ( Parser ): def SNORM(self): return self.getToken(MathExprParser.SNORM, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSNormFunc" ): + listener.enterSNormFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSNormFunc" ): + listener.exitSNormFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSNormFunc" ): @@ -1886,9 +2419,21 @@ class MathExprParser ( Parser ): def SIN(self): return self.getToken(MathExprParser.SIN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSinFunc" ): + listener.enterSinFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSinFunc" ): + listener.exitSinFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSinFunc" ): @@ -1897,6 +2442,37 @@ class MathExprParser ( Parser ): return visitor.visitChildren(self) + class StdFuncContext(Func1Context): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context + super().__init__(parser) + self.copyFrom(ctx) + + def STD(self): + return self.getToken(MathExprParser.STD, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) + def expr(self): + return self.getTypedRuleContext(MathExprParser.ExprContext,0) + + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStdFunc" ): + listener.enterStdFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStdFunc" ): + listener.exitStdFunc(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitStdFunc" ): + return visitor.visitStdFunc(self) + else: + return visitor.visitChildren(self) + + class AcosFuncContext(Func1Context): def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context @@ -1905,9 +2481,21 @@ class MathExprParser ( Parser ): def ACOS(self): return self.getToken(MathExprParser.ACOS, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAcosFunc" ): + listener.enterAcosFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAcosFunc" ): + listener.exitAcosFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAcosFunc" ): @@ -1924,9 +2512,21 @@ class MathExprParser ( Parser ): def COSH(self): return self.getToken(MathExprParser.COSH, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCoshFunc" ): + listener.enterCoshFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCoshFunc" ): + listener.exitCoshFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitCoshFunc" ): @@ -1943,9 +2543,21 @@ class MathExprParser ( Parser ): def ANGL(self): return self.getToken(MathExprParser.ANGL, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAnglFunc" ): + listener.enterAnglFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAnglFunc" ): + listener.exitAnglFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAnglFunc" ): @@ -1954,6 +2566,37 @@ class MathExprParser ( Parser ): return visitor.visitChildren(self) + class SumFuncContext(Func1Context): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context + super().__init__(parser) + self.copyFrom(ctx) + + def SUM(self): + return self.getToken(MathExprParser.SUM, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) + def expr(self): + return self.getTypedRuleContext(MathExprParser.ExprContext,0) + + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSumFunc" ): + listener.enterSumFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSumFunc" ): + listener.exitSumFunc(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitSumFunc" ): + return visitor.visitSumFunc(self) + else: + return visitor.visitChildren(self) + + class SignFuncContext(Func1Context): def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context @@ -1962,9 +2605,21 @@ class MathExprParser ( Parser ): def SIGN(self): return self.getToken(MathExprParser.SIGN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSignFunc" ): + listener.enterSignFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSignFunc" ): + listener.exitSignFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSignFunc" ): @@ -1981,9 +2636,21 @@ class MathExprParser ( Parser ): def TAN(self): return self.getToken(MathExprParser.TAN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTanFunc" ): + listener.enterTanFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTanFunc" ): + listener.exitTanFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitTanFunc" ): @@ -2000,9 +2667,21 @@ class MathExprParser ( Parser ): def PINV(self): return self.getToken(MathExprParser.PINV, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPinvFunc" ): + listener.enterPinvFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPinvFunc" ): + listener.exitPinvFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitPinvFunc" ): @@ -2019,9 +2698,21 @@ class MathExprParser ( Parser ): def SIFFT(self): return self.getToken(MathExprParser.SIFFT, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSifftFunc" ): + listener.enterSifftFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSifftFunc" ): + listener.exitSifftFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSifftFunc" ): @@ -2038,9 +2729,21 @@ class MathExprParser ( Parser ): def FRACT(self): return self.getToken(MathExprParser.FRACT, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterFractFunc" ): + listener.enterFractFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitFractFunc" ): + listener.exitFractFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitFractFunc" ): @@ -2057,9 +2760,21 @@ class MathExprParser ( Parser ): def GAMMA(self): return self.getToken(MathExprParser.GAMMA, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterGammaFunc" ): + listener.enterGammaFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitGammaFunc" ): + listener.exitGammaFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitGammaFunc" ): @@ -2076,9 +2791,21 @@ class MathExprParser ( Parser ): def COS(self): return self.getToken(MathExprParser.COS, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterCosFunc" ): + listener.enterCosFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitCosFunc" ): + listener.exitCosFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitCosFunc" ): @@ -2087,6 +2814,37 @@ class MathExprParser ( Parser ): return visitor.visitChildren(self) + class VarFuncContext(Func1Context): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context + super().__init__(parser) + self.copyFrom(ctx) + + def VAR(self): + return self.getToken(MathExprParser.VAR, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) + def expr(self): + return self.getTypedRuleContext(MathExprParser.ExprContext,0) + + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVarFunc" ): + listener.enterVarFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVarFunc" ): + listener.exitVarFunc(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitVarFunc" ): + return visitor.visitVarFunc(self) + else: + return visitor.visitChildren(self) + + class AsinFuncContext(Func1Context): def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func1Context @@ -2095,9 +2853,21 @@ class MathExprParser ( Parser ): def ASIN(self): return self.getToken(MathExprParser.ASIN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAsinFunc" ): + listener.enterAsinFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAsinFunc" ): + listener.exitAsinFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAsinFunc" ): @@ -2114,9 +2884,21 @@ class MathExprParser ( Parser ): def ASINH(self): return self.getToken(MathExprParser.ASINH, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAsinhFunc" ): + listener.enterAsinhFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAsinhFunc" ): + listener.exitAsinhFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAsinhFunc" ): @@ -2133,9 +2915,21 @@ class MathExprParser ( Parser ): def SFFT(self): return self.getToken(MathExprParser.SFFT, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSfftFunc" ): + listener.enterSfftFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSfftFunc" ): + listener.exitSfftFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSfftFunc" ): @@ -2152,9 +2946,21 @@ class MathExprParser ( Parser ): def ATANH(self): return self.getToken(MathExprParser.ATANH, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAtanhFunc" ): + listener.enterAtanhFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAtanhFunc" ): + listener.exitAtanhFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAtanhFunc" ): @@ -2171,9 +2977,21 @@ class MathExprParser ( Parser ): def EXP(self): return self.getToken(MathExprParser.EXP, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterExpFunc" ): + listener.enterExpFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitExpFunc" ): + listener.exitExpFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitExpFunc" ): @@ -2190,9 +3008,21 @@ class MathExprParser ( Parser ): def PRINT_SHAPE(self): return self.getToken(MathExprParser.PRINT_SHAPE, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self): return self.getTypedRuleContext(MathExprParser.ExprContext,0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPrintShapeFunc" ): + listener.enterPrintShapeFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPrintShapeFunc" ): + listener.exitPrintShapeFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitPrintShapeFunc" ): @@ -2207,428 +3037,476 @@ class MathExprParser ( Parser ): localctx = MathExprParser.Func1Context(self, self._ctx, self.state) self.enterRule(localctx, 14, self.RULE_func1) try: - self.state = 303 + self.state = 323 self._errHandler.sync(self) token = self._input.LA(1) - if token in [6]: + if token in [1]: localctx = MathExprParser.SinFuncContext(self, localctx) self.enterOuterAlt(localctx, 1) self.state = 128 self.match(MathExprParser.SIN) self.state = 129 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 130 self.expr() self.state = 131 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [7]: + elif token in [2]: localctx = MathExprParser.CosFuncContext(self, localctx) self.enterOuterAlt(localctx, 2) self.state = 133 self.match(MathExprParser.COS) self.state = 134 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 135 self.expr() self.state = 136 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [8]: + elif token in [3]: localctx = MathExprParser.TanFuncContext(self, localctx) self.enterOuterAlt(localctx, 3) self.state = 138 self.match(MathExprParser.TAN) self.state = 139 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 140 self.expr() self.state = 141 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [9]: + elif token in [4]: localctx = MathExprParser.AsinFuncContext(self, localctx) self.enterOuterAlt(localctx, 4) self.state = 143 self.match(MathExprParser.ASIN) self.state = 144 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 145 self.expr() self.state = 146 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [10]: + elif token in [5]: localctx = MathExprParser.AcosFuncContext(self, localctx) self.enterOuterAlt(localctx, 5) self.state = 148 self.match(MathExprParser.ACOS) self.state = 149 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 150 self.expr() self.state = 151 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [11]: + elif token in [6]: localctx = MathExprParser.AtanFuncContext(self, localctx) self.enterOuterAlt(localctx, 6) self.state = 153 self.match(MathExprParser.ATAN) self.state = 154 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 155 self.expr() self.state = 156 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [13]: + elif token in [8]: localctx = MathExprParser.SinhFuncContext(self, localctx) self.enterOuterAlt(localctx, 7) self.state = 158 self.match(MathExprParser.SINH) self.state = 159 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 160 self.expr() self.state = 161 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [14]: + elif token in [9]: localctx = MathExprParser.CoshFuncContext(self, localctx) self.enterOuterAlt(localctx, 8) self.state = 163 self.match(MathExprParser.COSH) self.state = 164 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 165 self.expr() self.state = 166 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [15]: + elif token in [10]: localctx = MathExprParser.TanhFuncContext(self, localctx) self.enterOuterAlt(localctx, 9) self.state = 168 self.match(MathExprParser.TANH) self.state = 169 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 170 self.expr() self.state = 171 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [16]: + elif token in [11]: localctx = MathExprParser.AsinhFuncContext(self, localctx) self.enterOuterAlt(localctx, 10) self.state = 173 self.match(MathExprParser.ASINH) self.state = 174 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 175 self.expr() self.state = 176 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [17]: + elif token in [12]: localctx = MathExprParser.AcoshFuncContext(self, localctx) self.enterOuterAlt(localctx, 11) self.state = 178 self.match(MathExprParser.ACOSH) self.state = 179 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 180 self.expr() self.state = 181 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [18]: + elif token in [13]: localctx = MathExprParser.AtanhFuncContext(self, localctx) self.enterOuterAlt(localctx, 12) self.state = 183 self.match(MathExprParser.ATANH) self.state = 184 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 185 self.expr() self.state = 186 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [19]: + elif token in [14]: localctx = MathExprParser.AbsFuncContext(self, localctx) self.enterOuterAlt(localctx, 13) self.state = 188 self.match(MathExprParser.ABS) self.state = 189 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 190 self.expr() self.state = 191 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [20]: + elif token in [15]: localctx = MathExprParser.SqrtFuncContext(self, localctx) self.enterOuterAlt(localctx, 14) self.state = 193 self.match(MathExprParser.SQRT) self.state = 194 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 195 self.expr() self.state = 196 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [21]: + elif token in [16]: localctx = MathExprParser.LnFuncContext(self, localctx) self.enterOuterAlt(localctx, 15) self.state = 198 self.match(MathExprParser.LN) self.state = 199 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 200 self.expr() self.state = 201 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [22]: + elif token in [17]: localctx = MathExprParser.LogFuncContext(self, localctx) self.enterOuterAlt(localctx, 16) self.state = 203 self.match(MathExprParser.LOG) self.state = 204 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 205 self.expr() self.state = 206 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [23]: + elif token in [18]: localctx = MathExprParser.ExpFuncContext(self, localctx) self.enterOuterAlt(localctx, 17) self.state = 208 self.match(MathExprParser.EXP) self.state = 209 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 210 self.expr() self.state = 211 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [28]: + elif token in [23]: localctx = MathExprParser.TNormFuncContext(self, localctx) self.enterOuterAlt(localctx, 18) self.state = 213 self.match(MathExprParser.TNORM) self.state = 214 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 215 self.expr() self.state = 216 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [29]: + elif token in [24]: localctx = MathExprParser.SNormFuncContext(self, localctx) self.enterOuterAlt(localctx, 19) self.state = 218 self.match(MathExprParser.SNORM) self.state = 219 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 220 self.expr() self.state = 221 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [30]: + elif token in [25]: localctx = MathExprParser.FloorFuncContext(self, localctx) self.enterOuterAlt(localctx, 20) self.state = 223 self.match(MathExprParser.FLOOR) self.state = 224 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 225 self.expr() self.state = 226 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [31]: + elif token in [26]: localctx = MathExprParser.CeilFuncContext(self, localctx) self.enterOuterAlt(localctx, 21) self.state = 228 self.match(MathExprParser.CEIL) self.state = 229 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 230 self.expr() self.state = 231 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [32]: + elif token in [27]: localctx = MathExprParser.RoundFuncContext(self, localctx) self.enterOuterAlt(localctx, 22) self.state = 233 self.match(MathExprParser.ROUND) self.state = 234 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 235 self.expr() self.state = 236 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [33]: + elif token in [28]: localctx = MathExprParser.GammaFuncContext(self, localctx) self.enterOuterAlt(localctx, 23) self.state = 238 self.match(MathExprParser.GAMMA) self.state = 239 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 240 self.expr() self.state = 241 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [35]: + elif token in [30]: localctx = MathExprParser.SigmoidFuncContext(self, localctx) self.enterOuterAlt(localctx, 24) self.state = 243 self.match(MathExprParser.SIGM) self.state = 244 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 245 self.expr() self.state = 246 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [37]: + elif token in [32]: localctx = MathExprParser.SfftFuncContext(self, localctx) self.enterOuterAlt(localctx, 25) self.state = 248 self.match(MathExprParser.SFFT) self.state = 249 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 250 self.expr() self.state = 251 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [38]: + elif token in [33]: localctx = MathExprParser.SifftFuncContext(self, localctx) self.enterOuterAlt(localctx, 26) self.state = 253 self.match(MathExprParser.SIFFT) self.state = 254 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 255 self.expr() self.state = 256 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [39]: + elif token in [34]: localctx = MathExprParser.AnglFuncContext(self, localctx) self.enterOuterAlt(localctx, 27) self.state = 258 self.match(MathExprParser.ANGL) self.state = 259 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 260 self.expr() self.state = 261 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [40]: + elif token in [35]: localctx = MathExprParser.PrintFuncContext(self, localctx) self.enterOuterAlt(localctx, 28) self.state = 263 self.match(MathExprParser.PRNT) self.state = 264 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 265 self.expr() self.state = 266 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [45]: + elif token in [40]: localctx = MathExprParser.FractFuncContext(self, localctx) self.enterOuterAlt(localctx, 29) self.state = 268 self.match(MathExprParser.FRACT) self.state = 269 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 270 self.expr() self.state = 271 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [46]: + elif token in [41]: localctx = MathExprParser.ReluFuncContext(self, localctx) self.enterOuterAlt(localctx, 30) self.state = 273 self.match(MathExprParser.RELU) self.state = 274 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 275 self.expr() self.state = 276 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [47]: + elif token in [42]: localctx = MathExprParser.SoftplusFuncContext(self, localctx) self.enterOuterAlt(localctx, 31) self.state = 278 self.match(MathExprParser.SOFTPLUS) self.state = 279 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 280 self.expr() self.state = 281 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [48]: + elif token in [43]: localctx = MathExprParser.GeluFuncContext(self, localctx) self.enterOuterAlt(localctx, 32) self.state = 283 self.match(MathExprParser.GELU) self.state = 284 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 285 self.expr() self.state = 286 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [49]: + elif token in [44]: localctx = MathExprParser.SignFuncContext(self, localctx) self.enterOuterAlt(localctx, 33) self.state = 288 self.match(MathExprParser.SIGN) self.state = 289 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 290 self.expr() self.state = 291 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [41]: + elif token in [36]: localctx = MathExprParser.PrintShapeFuncContext(self, localctx) self.enterOuterAlt(localctx, 34) self.state = 293 self.match(MathExprParser.PRINT_SHAPE) self.state = 294 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 295 self.expr() self.state = 296 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) pass - elif token in [59]: + elif token in [54]: localctx = MathExprParser.PinvFuncContext(self, localctx) self.enterOuterAlt(localctx, 35) self.state = 298 self.match(MathExprParser.PINV) self.state = 299 - self.match(MathExprParser.T__0) + self.match(MathExprParser.LPAREN) self.state = 300 self.expr() self.state = 301 - self.match(MathExprParser.T__1) + self.match(MathExprParser.RPAREN) + pass + elif token in [55]: + localctx = MathExprParser.SumFuncContext(self, localctx) + self.enterOuterAlt(localctx, 36) + self.state = 303 + self.match(MathExprParser.SUM) + self.state = 304 + self.match(MathExprParser.LPAREN) + self.state = 305 + self.expr() + self.state = 306 + self.match(MathExprParser.RPAREN) + pass + elif token in [56]: + localctx = MathExprParser.MeanFuncContext(self, localctx) + self.enterOuterAlt(localctx, 37) + self.state = 308 + self.match(MathExprParser.MEAN) + self.state = 309 + self.match(MathExprParser.LPAREN) + self.state = 310 + self.expr() + self.state = 311 + self.match(MathExprParser.RPAREN) + pass + elif token in [57]: + localctx = MathExprParser.StdFuncContext(self, localctx) + self.enterOuterAlt(localctx, 38) + self.state = 313 + self.match(MathExprParser.STD) + self.state = 314 + self.match(MathExprParser.LPAREN) + self.state = 315 + self.expr() + self.state = 316 + self.match(MathExprParser.RPAREN) + pass + elif token in [58]: + localctx = MathExprParser.VarFuncContext(self, localctx) + self.enterOuterAlt(localctx, 39) + self.state = 318 + self.match(MathExprParser.VAR) + self.state = 319 + self.match(MathExprParser.LPAREN) + self.state = 320 + self.expr() + self.state = 321 + self.match(MathExprParser.RPAREN) pass else: raise NoViableAltException(self) @@ -2667,12 +3545,26 @@ class MathExprParser ( Parser ): def TOPK(self): return self.getToken(MathExprParser.TOPK, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTopkFunc" ): + listener.enterTopkFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTopkFunc" ): + listener.exitTopkFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitTopkFunc" ): @@ -2689,12 +3581,26 @@ class MathExprParser ( Parser ): def BOTK(self): return self.getToken(MathExprParser.BOTK, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterBotkFunc" ): + listener.enterBotkFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitBotkFunc" ): + listener.exitBotkFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitBotkFunc" ): @@ -2703,6 +3609,42 @@ class MathExprParser ( Parser ): return visitor.visitChildren(self) + class PercentileFuncContext(Func2Context): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func2Context + super().__init__(parser) + self.copyFrom(ctx) + + def PERCENTILE(self): + return self.getToken(MathExprParser.PERCENTILE, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(MathExprParser.ExprContext) + else: + return self.getTypedRuleContext(MathExprParser.ExprContext,i) + + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPercentileFunc" ): + listener.enterPercentileFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPercentileFunc" ): + listener.exitPercentileFunc(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitPercentileFunc" ): + return visitor.visitPercentileFunc(self) + else: + return visitor.visitChildren(self) + + class TMaxFuncContext(Func2Context): def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func2Context @@ -2711,12 +3653,26 @@ class MathExprParser ( Parser ): def TMAX(self): return self.getToken(MathExprParser.TMAX, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTMaxFunc" ): + listener.enterTMaxFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTMaxFunc" ): + listener.exitTMaxFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitTMaxFunc" ): @@ -2733,12 +3689,26 @@ class MathExprParser ( Parser ): def POWE(self): return self.getToken(MathExprParser.POWE, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPowFunc" ): + listener.enterPowFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPowFunc" ): + listener.exitPowFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitPowFunc" ): @@ -2747,6 +3717,42 @@ class MathExprParser ( Parser ): return visitor.visitChildren(self) + class DotFuncContext(Func2Context): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func2Context + super().__init__(parser) + self.copyFrom(ctx) + + def DOT(self): + return self.getToken(MathExprParser.DOT, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(MathExprParser.ExprContext) + else: + return self.getTypedRuleContext(MathExprParser.ExprContext,i) + + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterDotFunc" ): + listener.enterDotFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitDotFunc" ): + listener.exitDotFunc(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitDotFunc" ): + return visitor.visitDotFunc(self) + else: + return visitor.visitChildren(self) + + class StepFuncContext(Func2Context): def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func2Context @@ -2755,12 +3761,26 @@ class MathExprParser ( Parser ): def STEP(self): return self.getToken(MathExprParser.STEP, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterStepFunc" ): + listener.enterStepFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitStepFunc" ): + listener.exitStepFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitStepFunc" ): @@ -2777,12 +3797,26 @@ class MathExprParser ( Parser ): def ATAN2(self): return self.getToken(MathExprParser.ATAN2, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterAtan2Func" ): + listener.enterAtan2Func(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitAtan2Func" ): + listener.exitAtan2Func(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitAtan2Func" ): @@ -2791,6 +3825,42 @@ class MathExprParser ( Parser ): return visitor.visitChildren(self) + class QuartileFuncContext(Func2Context): + + def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func2Context + super().__init__(parser) + self.copyFrom(ctx) + + def QUARTILE(self): + return self.getToken(MathExprParser.QUARTILE, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) + def expr(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(MathExprParser.ExprContext) + else: + return self.getTypedRuleContext(MathExprParser.ExprContext,i) + + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterQuartileFunc" ): + listener.enterQuartileFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitQuartileFunc" ): + listener.exitQuartileFunc(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitQuartileFunc" ): + return visitor.visitQuartileFunc(self) + else: + return visitor.visitChildren(self) + + class TMinFuncContext(Func2Context): def __init__(self, parser, ctx:ParserRuleContext): # actually a MathExprParser.Func2Context @@ -2799,12 +3869,26 @@ class MathExprParser ( Parser ): def TMIN(self): return self.getToken(MathExprParser.TMIN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterTMinFunc" ): + listener.enterTMinFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitTMinFunc" ): + listener.exitTMinFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitTMinFunc" ): @@ -2819,120 +3903,168 @@ class MathExprParser ( Parser ): localctx = MathExprParser.Func2Context(self, self._ctx, self.state) self.enterRule(localctx, 16, self.RULE_func2) try: - self.state = 354 + self.state = 395 self._errHandler.sync(self) token = self._input.LA(1) - if token in [34]: + if token in [29]: localctx = MathExprParser.PowFuncContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 305 + self.state = 325 self.match(MathExprParser.POWE) - self.state = 306 - self.match(MathExprParser.T__0) - self.state = 307 + self.state = 326 + self.match(MathExprParser.LPAREN) + self.state = 327 self.expr() - self.state = 308 - self.match(MathExprParser.T__3) - self.state = 309 + self.state = 328 + self.match(MathExprParser.COMMA) + self.state = 329 self.expr() - self.state = 310 - self.match(MathExprParser.T__1) + self.state = 330 + self.match(MathExprParser.RPAREN) pass - elif token in [12]: + elif token in [7]: localctx = MathExprParser.Atan2FuncContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 312 + self.state = 332 self.match(MathExprParser.ATAN2) - self.state = 313 - self.match(MathExprParser.T__0) - self.state = 314 + self.state = 333 + self.match(MathExprParser.LPAREN) + self.state = 334 self.expr() - self.state = 315 - self.match(MathExprParser.T__3) - self.state = 316 + self.state = 335 + self.match(MathExprParser.COMMA) + self.state = 336 self.expr() - self.state = 317 - self.match(MathExprParser.T__1) + self.state = 337 + self.match(MathExprParser.RPAREN) pass - elif token in [26]: + elif token in [21]: localctx = MathExprParser.TMinFuncContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 319 + self.state = 339 self.match(MathExprParser.TMIN) - self.state = 320 - self.match(MathExprParser.T__0) - self.state = 321 + self.state = 340 + self.match(MathExprParser.LPAREN) + self.state = 341 self.expr() - self.state = 322 - self.match(MathExprParser.T__3) - self.state = 323 + self.state = 342 + self.match(MathExprParser.COMMA) + self.state = 343 self.expr() - self.state = 324 - self.match(MathExprParser.T__1) + self.state = 344 + self.match(MathExprParser.RPAREN) pass - elif token in [27]: + elif token in [22]: localctx = MathExprParser.TMaxFuncContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 326 + self.state = 346 self.match(MathExprParser.TMAX) - self.state = 327 - self.match(MathExprParser.T__0) - self.state = 328 + self.state = 347 + self.match(MathExprParser.LPAREN) + self.state = 348 self.expr() - self.state = 329 - self.match(MathExprParser.T__3) - self.state = 330 + self.state = 349 + self.match(MathExprParser.COMMA) + self.state = 350 self.expr() - self.state = 331 - self.match(MathExprParser.T__1) + self.state = 351 + self.match(MathExprParser.RPAREN) pass - elif token in [43]: + elif token in [38]: localctx = MathExprParser.StepFuncContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 333 + self.state = 353 self.match(MathExprParser.STEP) - self.state = 334 - self.match(MathExprParser.T__0) - self.state = 335 + self.state = 354 + self.match(MathExprParser.LPAREN) + self.state = 355 self.expr() - self.state = 336 - self.match(MathExprParser.T__3) - self.state = 337 + self.state = 356 + self.match(MathExprParser.COMMA) + self.state = 357 self.expr() - self.state = 338 - self.match(MathExprParser.T__1) + self.state = 358 + self.match(MathExprParser.RPAREN) pass - elif token in [57]: + elif token in [52]: localctx = MathExprParser.TopkFuncContext(self, localctx) self.enterOuterAlt(localctx, 6) - self.state = 340 + self.state = 360 self.match(MathExprParser.TOPK) - self.state = 341 - self.match(MathExprParser.T__0) - self.state = 342 + self.state = 361 + self.match(MathExprParser.LPAREN) + self.state = 362 self.expr() - self.state = 343 - self.match(MathExprParser.T__3) - self.state = 344 + self.state = 363 + self.match(MathExprParser.COMMA) + self.state = 364 self.expr() - self.state = 345 - self.match(MathExprParser.T__1) + self.state = 365 + self.match(MathExprParser.RPAREN) pass - elif token in [58]: + elif token in [53]: localctx = MathExprParser.BotkFuncContext(self, localctx) self.enterOuterAlt(localctx, 7) - self.state = 347 + self.state = 367 self.match(MathExprParser.BOTK) - self.state = 348 - self.match(MathExprParser.T__0) - self.state = 349 + self.state = 368 + self.match(MathExprParser.LPAREN) + self.state = 369 self.expr() - self.state = 350 - self.match(MathExprParser.T__3) - self.state = 351 + self.state = 370 + self.match(MathExprParser.COMMA) + self.state = 371 self.expr() - self.state = 352 - self.match(MathExprParser.T__1) + self.state = 372 + self.match(MathExprParser.RPAREN) + pass + elif token in [59]: + localctx = MathExprParser.QuartileFuncContext(self, localctx) + self.enterOuterAlt(localctx, 8) + self.state = 374 + self.match(MathExprParser.QUARTILE) + self.state = 375 + self.match(MathExprParser.LPAREN) + self.state = 376 + self.expr() + self.state = 377 + self.match(MathExprParser.COMMA) + self.state = 378 + self.expr() + self.state = 379 + self.match(MathExprParser.RPAREN) + pass + elif token in [60]: + localctx = MathExprParser.PercentileFuncContext(self, localctx) + self.enterOuterAlt(localctx, 9) + self.state = 381 + self.match(MathExprParser.PERCENTILE) + self.state = 382 + self.match(MathExprParser.LPAREN) + self.state = 383 + self.expr() + self.state = 384 + self.match(MathExprParser.COMMA) + self.state = 385 + self.expr() + self.state = 386 + self.match(MathExprParser.RPAREN) + pass + elif token in [61]: + localctx = MathExprParser.DotFuncContext(self, localctx) + self.enterOuterAlt(localctx, 10) + self.state = 388 + self.match(MathExprParser.DOT) + self.state = 389 + self.match(MathExprParser.LPAREN) + self.state = 390 + self.expr() + self.state = 391 + self.match(MathExprParser.COMMA) + self.state = 392 + self.expr() + self.state = 393 + self.match(MathExprParser.RPAREN) pass else: raise NoViableAltException(self) @@ -2971,12 +4103,29 @@ class MathExprParser ( Parser ): def LERP(self): return self.getToken(MathExprParser.LERP, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterLerpFunc" ): + listener.enterLerpFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitLerpFunc" ): + listener.exitLerpFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitLerpFunc" ): @@ -2993,12 +4142,29 @@ class MathExprParser ( Parser ): def SMOOTHSTEP(self): return self.getToken(MathExprParser.SMOOTHSTEP, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSmoothstepFunc" ): + listener.enterSmoothstepFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSmoothstepFunc" ): + listener.exitSmoothstepFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSmoothstepFunc" ): @@ -3015,12 +4181,29 @@ class MathExprParser ( Parser ): def RANGE(self): return self.getToken(MathExprParser.RANGE, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterRangeFunc" ): + listener.enterRangeFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitRangeFunc" ): + listener.exitRangeFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitRangeFunc" ): @@ -3037,12 +4220,29 @@ class MathExprParser ( Parser ): def CLAMP(self): return self.getToken(MathExprParser.CLAMP, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterClampFunc" ): + listener.enterClampFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitClampFunc" ): + listener.exitClampFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitClampFunc" ): @@ -3057,88 +4257,88 @@ class MathExprParser ( Parser ): localctx = MathExprParser.Func3Context(self, self._ctx, self.state) self.enterRule(localctx, 18, self.RULE_func3) try: - self.state = 392 + self.state = 433 self._errHandler.sync(self) token = self._input.LA(1) - if token in [36]: + if token in [31]: localctx = MathExprParser.ClampFuncContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 356 + self.state = 397 self.match(MathExprParser.CLAMP) - self.state = 357 - self.match(MathExprParser.T__0) - self.state = 358 + self.state = 398 + self.match(MathExprParser.LPAREN) + self.state = 399 self.expr() - self.state = 359 - self.match(MathExprParser.T__3) - self.state = 360 + self.state = 400 + self.match(MathExprParser.COMMA) + self.state = 401 self.expr() - self.state = 361 - self.match(MathExprParser.T__3) - self.state = 362 + self.state = 402 + self.match(MathExprParser.COMMA) + self.state = 403 self.expr() - self.state = 363 - self.match(MathExprParser.T__1) + self.state = 404 + self.match(MathExprParser.RPAREN) pass - elif token in [42]: + elif token in [37]: localctx = MathExprParser.LerpFuncContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 365 + self.state = 406 self.match(MathExprParser.LERP) - self.state = 366 - self.match(MathExprParser.T__0) - self.state = 367 + self.state = 407 + self.match(MathExprParser.LPAREN) + self.state = 408 self.expr() - self.state = 368 - self.match(MathExprParser.T__3) - self.state = 369 + self.state = 409 + self.match(MathExprParser.COMMA) + self.state = 410 self.expr() - self.state = 370 - self.match(MathExprParser.T__3) - self.state = 371 + self.state = 411 + self.match(MathExprParser.COMMA) + self.state = 412 self.expr() - self.state = 372 - self.match(MathExprParser.T__1) + self.state = 413 + self.match(MathExprParser.RPAREN) pass - elif token in [44]: + elif token in [39]: localctx = MathExprParser.SmoothstepFuncContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 374 + self.state = 415 self.match(MathExprParser.SMOOTHSTEP) - self.state = 375 - self.match(MathExprParser.T__0) - self.state = 376 + self.state = 416 + self.match(MathExprParser.LPAREN) + self.state = 417 self.expr() - self.state = 377 - self.match(MathExprParser.T__3) - self.state = 378 + self.state = 418 + self.match(MathExprParser.COMMA) + self.state = 419 self.expr() - self.state = 379 - self.match(MathExprParser.T__3) - self.state = 380 + self.state = 420 + self.match(MathExprParser.COMMA) + self.state = 421 self.expr() - self.state = 381 - self.match(MathExprParser.T__1) + self.state = 422 + self.match(MathExprParser.RPAREN) pass - elif token in [56]: + elif token in [51]: localctx = MathExprParser.RangeFuncContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 383 + self.state = 424 self.match(MathExprParser.RANGE) - self.state = 384 - self.match(MathExprParser.T__0) - self.state = 385 + self.state = 425 + self.match(MathExprParser.LPAREN) + self.state = 426 self.expr() - self.state = 386 - self.match(MathExprParser.T__3) - self.state = 387 + self.state = 427 + self.match(MathExprParser.COMMA) + self.state = 428 self.expr() - self.state = 388 - self.match(MathExprParser.T__3) - self.state = 389 + self.state = 429 + self.match(MathExprParser.COMMA) + self.state = 430 self.expr() - self.state = 390 - self.match(MathExprParser.T__1) + self.state = 431 + self.match(MathExprParser.RPAREN) pass else: raise NoViableAltException(self) @@ -3177,12 +4377,29 @@ class MathExprParser ( Parser ): def SWAP(self): return self.getToken(MathExprParser.SWAP, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSwapFunc" ): + listener.enterSwapFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSwapFunc" ): + listener.exitSwapFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSwapFunc" ): @@ -3199,26 +4416,26 @@ class MathExprParser ( Parser ): try: localctx = MathExprParser.SwapFuncContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 394 + self.state = 435 self.match(MathExprParser.SWAP) - self.state = 395 - self.match(MathExprParser.T__0) - self.state = 396 + self.state = 436 + self.match(MathExprParser.LPAREN) + self.state = 437 self.expr() - self.state = 397 - self.match(MathExprParser.T__3) - self.state = 398 + self.state = 438 + self.match(MathExprParser.COMMA) + self.state = 439 self.expr() - self.state = 399 - self.match(MathExprParser.T__3) - self.state = 400 + self.state = 440 + self.match(MathExprParser.COMMA) + self.state = 441 self.expr() - self.state = 401 - self.match(MathExprParser.T__3) - self.state = 402 + self.state = 442 + self.match(MathExprParser.COMMA) + self.state = 443 self.expr() - self.state = 403 - self.match(MathExprParser.T__1) + self.state = 444 + self.match(MathExprParser.RPAREN) except RecognitionException as re: localctx.exception = re self._errHandler.reportError(self, re) @@ -3253,12 +4470,29 @@ class MathExprParser ( Parser ): def SMAX(self): return self.getToken(MathExprParser.SMAX, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSMaxFunc" ): + listener.enterSMaxFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSMaxFunc" ): + listener.exitSMaxFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSMaxFunc" ): @@ -3275,12 +4509,29 @@ class MathExprParser ( Parser ): def MAP(self): return self.getToken(MathExprParser.MAP, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterMapFunc" ): + listener.enterMapFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitMapFunc" ): + listener.exitMapFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitMapFunc" ): @@ -3297,12 +4548,29 @@ class MathExprParser ( Parser ): def EZCONV(self): return self.getToken(MathExprParser.EZCONV, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterEzConvFunc" ): + listener.enterEzConvFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitEzConvFunc" ): + listener.exitEzConvFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitEzConvFunc" ): @@ -3319,12 +4587,26 @@ class MathExprParser ( Parser ): def PERM(self): return self.getToken(MathExprParser.PERM, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterPermuteFunc" ): + listener.enterPermuteFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitPermuteFunc" ): + listener.exitPermuteFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitPermuteFunc" ): @@ -3341,12 +4623,26 @@ class MathExprParser ( Parser ): def RESHAPE(self): return self.getToken(MathExprParser.RESHAPE, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def COMMA(self): + return self.getToken(MathExprParser.COMMA, 0) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterReshapeFunc" ): + listener.enterReshapeFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitReshapeFunc" ): + listener.exitReshapeFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitReshapeFunc" ): @@ -3363,12 +4659,29 @@ class MathExprParser ( Parser ): def SMIN(self): return self.getToken(MathExprParser.SMIN, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterSMinFunc" ): + listener.enterSMinFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitSMinFunc" ): + listener.exitSMinFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitSMinFunc" ): @@ -3385,12 +4698,29 @@ class MathExprParser ( Parser ): def CONV(self): return self.getToken(MathExprParser.CONV, 0) + def LPAREN(self): + return self.getToken(MathExprParser.LPAREN, 0) def expr(self, i:int=None): if i is None: return self.getTypedRuleContexts(MathExprParser.ExprContext) else: return self.getTypedRuleContext(MathExprParser.ExprContext,i) + def RPAREN(self): + return self.getToken(MathExprParser.RPAREN, 0) + def COMMA(self, i:int=None): + if i is None: + return self.getTokens(MathExprParser.COMMA) + else: + return self.getToken(MathExprParser.COMMA, i) + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterConvFunc" ): + listener.enterConvFunc(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitConvFunc" ): + listener.exitConvFunc(self) def accept(self, visitor:ParseTreeVisitor): if hasattr( visitor, "visitConvFunc" ): @@ -3406,166 +4736,166 @@ class MathExprParser ( Parser ): self.enterRule(localctx, 22, self.RULE_funcN) self._la = 0 # Token type try: - self.state = 476 + self.state = 517 self._errHandler.sync(self) token = self._input.LA(1) - if token in [24]: + if token in [19]: localctx = MathExprParser.SMinFuncContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 405 + self.state = 446 self.match(MathExprParser.SMIN) - self.state = 406 - self.match(MathExprParser.T__0) - self.state = 407 + self.state = 447 + self.match(MathExprParser.LPAREN) + self.state = 448 self.expr() - self.state = 412 + self.state = 453 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==4: - self.state = 408 - self.match(MathExprParser.T__3) - self.state = 409 + while _la==77: + self.state = 449 + self.match(MathExprParser.COMMA) + self.state = 450 self.expr() - self.state = 414 + self.state = 455 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 415 - self.match(MathExprParser.T__1) + self.state = 456 + self.match(MathExprParser.RPAREN) pass - elif token in [25]: + elif token in [20]: localctx = MathExprParser.SMaxFuncContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 417 + self.state = 458 self.match(MathExprParser.SMAX) - self.state = 418 - self.match(MathExprParser.T__0) - self.state = 419 - self.expr() - self.state = 424 - self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==4: - self.state = 420 - self.match(MathExprParser.T__3) - self.state = 421 - self.expr() - self.state = 426 - self._errHandler.sync(self) - _la = self._input.LA(1) - - self.state = 427 - self.match(MathExprParser.T__1) - pass - elif token in [50]: - localctx = MathExprParser.MapFuncContext(self, localctx) - self.enterOuterAlt(localctx, 3) - self.state = 429 - self.match(MathExprParser.MAP) - self.state = 430 - self.match(MathExprParser.T__0) - self.state = 431 - self.expr() - self.state = 434 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 432 - self.match(MathExprParser.T__3) - self.state = 433 - self.expr() - self.state = 436 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==4): - break - - self.state = 438 - self.match(MathExprParser.T__1) - pass - elif token in [51]: - localctx = MathExprParser.EzConvFuncContext(self, localctx) - self.enterOuterAlt(localctx, 4) - self.state = 440 - self.match(MathExprParser.EZCONV) - self.state = 441 - self.match(MathExprParser.T__0) - self.state = 442 - self.expr() - self.state = 445 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 443 - self.match(MathExprParser.T__3) - self.state = 444 - self.expr() - self.state = 447 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==4): - break - - self.state = 449 - self.match(MathExprParser.T__1) - pass - elif token in [52]: - localctx = MathExprParser.ConvFuncContext(self, localctx) - self.enterOuterAlt(localctx, 5) - self.state = 451 - self.match(MathExprParser.CONV) - self.state = 452 - self.match(MathExprParser.T__0) - self.state = 453 - self.expr() - self.state = 456 - self._errHandler.sync(self) - _la = self._input.LA(1) - while True: - self.state = 454 - self.match(MathExprParser.T__3) - self.state = 455 - self.expr() - self.state = 458 - self._errHandler.sync(self) - _la = self._input.LA(1) - if not (_la==4): - break - + self.state = 459 + self.match(MathExprParser.LPAREN) self.state = 460 - self.match(MathExprParser.T__1) - pass - elif token in [54]: - localctx = MathExprParser.PermuteFuncContext(self, localctx) - self.enterOuterAlt(localctx, 6) - self.state = 462 - self.match(MathExprParser.PERM) - self.state = 463 - self.match(MathExprParser.T__0) - self.state = 464 self.expr() self.state = 465 - self.match(MathExprParser.T__3) - self.state = 466 - self.expr() - self.state = 467 - self.match(MathExprParser.T__1) + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==77: + self.state = 461 + self.match(MathExprParser.COMMA) + self.state = 462 + self.expr() + self.state = 467 + self._errHandler.sync(self) + _la = self._input.LA(1) + + self.state = 468 + self.match(MathExprParser.RPAREN) pass - elif token in [55]: + elif token in [45]: + localctx = MathExprParser.MapFuncContext(self, localctx) + self.enterOuterAlt(localctx, 3) + self.state = 470 + self.match(MathExprParser.MAP) + self.state = 471 + self.match(MathExprParser.LPAREN) + self.state = 472 + self.expr() + self.state = 475 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 473 + self.match(MathExprParser.COMMA) + self.state = 474 + self.expr() + self.state = 477 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==77): + break + + self.state = 479 + self.match(MathExprParser.RPAREN) + pass + elif token in [46]: + localctx = MathExprParser.EzConvFuncContext(self, localctx) + self.enterOuterAlt(localctx, 4) + self.state = 481 + self.match(MathExprParser.EZCONV) + self.state = 482 + self.match(MathExprParser.LPAREN) + self.state = 483 + self.expr() + self.state = 486 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 484 + self.match(MathExprParser.COMMA) + self.state = 485 + self.expr() + self.state = 488 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==77): + break + + self.state = 490 + self.match(MathExprParser.RPAREN) + pass + elif token in [47]: + localctx = MathExprParser.ConvFuncContext(self, localctx) + self.enterOuterAlt(localctx, 5) + self.state = 492 + self.match(MathExprParser.CONV) + self.state = 493 + self.match(MathExprParser.LPAREN) + self.state = 494 + self.expr() + self.state = 497 + self._errHandler.sync(self) + _la = self._input.LA(1) + while True: + self.state = 495 + self.match(MathExprParser.COMMA) + self.state = 496 + self.expr() + self.state = 499 + self._errHandler.sync(self) + _la = self._input.LA(1) + if not (_la==77): + break + + self.state = 501 + self.match(MathExprParser.RPAREN) + pass + elif token in [49]: + localctx = MathExprParser.PermuteFuncContext(self, localctx) + self.enterOuterAlt(localctx, 6) + self.state = 503 + self.match(MathExprParser.PERM) + self.state = 504 + self.match(MathExprParser.LPAREN) + self.state = 505 + self.expr() + self.state = 506 + self.match(MathExprParser.COMMA) + self.state = 507 + self.expr() + self.state = 508 + self.match(MathExprParser.RPAREN) + pass + elif token in [50]: localctx = MathExprParser.ReshapeFuncContext(self, localctx) self.enterOuterAlt(localctx, 7) - self.state = 469 + self.state = 510 self.match(MathExprParser.RESHAPE) - self.state = 470 - self.match(MathExprParser.T__0) - self.state = 471 + self.state = 511 + self.match(MathExprParser.LPAREN) + self.state = 512 self.expr() - self.state = 472 - self.match(MathExprParser.T__3) - self.state = 473 + self.state = 513 + self.match(MathExprParser.COMMA) + self.state = 514 self.expr() - self.state = 474 - self.match(MathExprParser.T__1) + self.state = 515 + self.match(MathExprParser.RPAREN) pass else: raise NoViableAltException(self) diff --git a/more_math/Parser/MathExprVisitor.py b/more_math/Parser/MathExprVisitor.py index 1328c5c..b6acaf4 100644 --- a/more_math/Parser/MathExprVisitor.py +++ b/more_math/Parser/MathExprVisitor.py @@ -1,4 +1,4 @@ -# Generated from MathExpr.g4 by ANTLR 4.13.2 +# Generated from ./MathExpr.g4 by ANTLR 4.13.2 from antlr4 import * if "." in __name__: from .MathExprParser import MathExprParser @@ -339,6 +339,26 @@ class MathExprVisitor(ParseTreeVisitor): return self.visitChildren(ctx) + # Visit a parse tree produced by MathExprParser#SumFunc. + def visitSumFunc(self, ctx:MathExprParser.SumFuncContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by MathExprParser#MeanFunc. + def visitMeanFunc(self, ctx:MathExprParser.MeanFuncContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by MathExprParser#StdFunc. + def visitStdFunc(self, ctx:MathExprParser.StdFuncContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by MathExprParser#VarFunc. + def visitVarFunc(self, ctx:MathExprParser.VarFuncContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by MathExprParser#PowFunc. def visitPowFunc(self, ctx:MathExprParser.PowFuncContext): return self.visitChildren(ctx) @@ -374,6 +394,21 @@ class MathExprVisitor(ParseTreeVisitor): return self.visitChildren(ctx) + # Visit a parse tree produced by MathExprParser#QuartileFunc. + def visitQuartileFunc(self, ctx:MathExprParser.QuartileFuncContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by MathExprParser#PercentileFunc. + def visitPercentileFunc(self, ctx:MathExprParser.PercentileFuncContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by MathExprParser#DotFunc. + def visitDotFunc(self, ctx:MathExprParser.DotFuncContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by MathExprParser#ClampFunc. def visitClampFunc(self, ctx:MathExprParser.ClampFuncContext): return self.visitChildren(ctx) diff --git a/more_math/Parser/UnifiedMathVisitor.py b/more_math/Parser/UnifiedMathVisitor.py index 25f1eef..6a3ccc8 100644 --- a/more_math/Parser/UnifiedMathVisitor.py +++ b/more_math/Parser/UnifiedMathVisitor.py @@ -62,6 +62,13 @@ class UnifiedMathVisitor(MathExprVisitor): return torch_op(a).contiguous() if torch_op else scalar_op(a) return scalar_op(a) + def _reduction_op(self, val, torch_op, list_op): + if self._is_tensor(val): + return torch_op(val) + if self._is_list(val): + return list_op(val) + return val + # ======================== # Visitors # ======================== @@ -587,6 +594,92 @@ class UnifiedMathVisitor(MathExprVisitor): return (coord / (size - 1)) * 2.0 - 1.0 return torch.zeros_like(coord) + def visitSumFunc(self, ctx): + return self._reduction_op(self.visit(ctx.expr()), torch.sum, sum) + + def visitMeanFunc(self, ctx): + return self._reduction_op( + self.visit(ctx.expr()), lambda x: torch.mean(x.float()), lambda x: sum(x) / len(x) if x else 0.0 + ) + + def visitStdFunc(self, ctx): + def list_std(val): + if len(val) < 2: + return 0.0 + mean = sum(val) / len(val) + variance = sum((x - mean) ** 2 for x in val) / (len(val) - 1) + return math.sqrt(variance) + + return self._reduction_op(self.visit(ctx.expr()), lambda x: torch.std(x.float()), list_std) + + def visitVarFunc(self, ctx): + def list_var(val): + if len(val) < 2: + return 0.0 + mean = sum(val) / len(val) + return sum((x - mean) ** 2 for x in val) / (len(val) - 1) + + return self._reduction_op(self.visit(ctx.expr()), lambda x: torch.var(x.float()), list_var) + + def _quartile_helper(self, val, q): + + if self._is_tensor(val): + return torch.quantile(val.float(), q) + if self._is_list(val): + if not val: + return 0.0 + sorted_data = sorted(val) + n = len(val) + pos = (n - 1) * q + whole = int(pos) + frac = pos - whole + if whole + 1 < n: + return sorted_data[whole] + (sorted_data[whole + 1] - sorted_data[whole]) * frac + else: + return sorted_data[whole] + return val + + def visitQuartileFunc(self, ctx): + val = self.visit(ctx.expr(0)) + k = self.visit(ctx.expr(1)) + + if self._is_tensor(k): + k_val = torch.tensor([self._quartile_helper(val,int(k.flatten()[x].item())/4.0) for x in range(0,k.flatten().shape[0])]) + return k_val.reshape(k.shape) + if self._is_list(k): + return [self._quartile_helper(val,int(k[x])/4.0) for x in range(0,k.size)] + else: + k_val = int(k) + + q = 0.5 + if 0 <= k_val <= 4: + q = k_val * 0.25 + else: + if k_val < 0: q = 0.0 + if k_val > 4: q = 1.0 + + return self._quartile_helper(val, q) + + def visitPercentileFunc(self, ctx): + val = self.visit(ctx.expr(0)) + p_raw = self.visit(ctx.expr(1)) + + if self._is_tensor(p_raw): + k_val = torch.tensor([self._quartile_helper(val,p_raw.flatten()[x].item()) for x in range(0,p_raw.flatten().shape[0])]) + return k_val.reshape(p_raw.shape) + if self._is_list(p_raw): + return [self._quartile_helper(val,p_raw[x]) for x in range(0,p_raw.size)] + else: + p = float(p_raw) + + q = max(0.0, min(1.0, p)) + return self._quartile_helper(val, q) + + def visitDotFunc(self, ctx): + a = self._promote_to_tensor(self.visit(ctx.expr(0))) + b = self._promote_to_tensor(self.visit(ctx.expr(1))) + return torch.dot(a.flatten(), b.flatten()) + def visitMapFunc(self, ctx): tensor = self._promote_to_tensor(self.visit(ctx.expr(0))) coords = [self._promote_to_tensor(self.visit(ctx.expr(i))) for i in range(1, len(ctx.expr()))]