diff --git a/internal/parser/planparserv2/Plan.g4 b/internal/parser/planparserv2/Plan.g4 index b051cd2735..8f4d928029 100644 --- a/internal/parser/planparserv2/Plan.g4 +++ b/internal/parser/planparserv2/Plan.g4 @@ -17,6 +17,7 @@ expr: | expr op = (SHL | SHR) expr # Shift | expr op = (IN | NIN) ('[' expr (',' expr)* ','? ']') # Term | expr op = (IN | NIN) EmptyTerm # EmptyTerm + | JSONContains'('expr',' expr')' # JSONContains | expr op1 = (LT | LE) (Identifier | JSONIdentifier) op2 = (LT | LE) expr # Range | expr op1 = (GT | GE) (Identifier | JSONIdentifier) op2 = (GT | GE) expr # ReverseRange | expr op = (LT | LE | GT | GE) expr # Relational @@ -70,6 +71,8 @@ IN: 'in'; NIN: 'not in'; EmptyTerm: '[' (Whitespace | Newline)* ']'; +JSONContains: 'json_contains'; + BooleanConstant: 'true' | 'True' | 'TRUE' | 'false' | 'False' | 'FALSE'; IntegerConstant: diff --git a/internal/parser/planparserv2/generated/Plan.interp b/internal/parser/planparserv2/generated/Plan.interp index 58b0536e5c..b491f7be18 100644 --- a/internal/parser/planparserv2/generated/Plan.interp +++ b/internal/parser/planparserv2/generated/Plan.interp @@ -31,6 +31,7 @@ null 'in' 'not in' null +'json_contains' null null null @@ -73,6 +74,7 @@ NOT IN NIN EmptyTerm +JSONContains BooleanConstant IntegerConstant FloatingConstant @@ -87,4 +89,4 @@ expr atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 41, 92, 4, 2, 9, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 20, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, 2, 74, 10, 2, 12, 2, 14, 2, 77, 11, 2, 3, 2, 5, 2, 80, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, 2, 87, 10, 2, 12, 2, 14, 2, 90, 11, 2, 3, 2, 2, 3, 2, 3, 2, 2, 12, 4, 2, 16, 17, 29, 30, 3, 2, 18, 20, 3, 2, 16, 17, 3, 2, 22, 23, 3, 2, 8, 9, 4, 2, 37, 37, 39, 39, 3, 2, 10, 11, 3, 2, 8, 11, 3, 2, 12, 13, 3, 2, 31, 32, 2, 116, 2, 19, 3, 2, 2, 2, 4, 5, 8, 2, 1, 2, 5, 20, 7, 35, 2, 2, 6, 20, 7, 36, 2, 2, 7, 20, 7, 34, 2, 2, 8, 20, 7, 38, 2, 2, 9, 20, 7, 37, 2, 2, 10, 20, 7, 39, 2, 2, 11, 12, 7, 3, 2, 2, 12, 13, 5, 2, 2, 2, 13, 14, 7, 4, 2, 2, 14, 20, 3, 2, 2, 2, 15, 16, 9, 2, 2, 2, 16, 20, 5, 2, 2, 18, 17, 18, 7, 15, 2, 2, 18, 20, 5, 2, 2, 3, 19, 4, 3, 2, 2, 2, 19, 6, 3, 2, 2, 2, 19, 7, 3, 2, 2, 2, 19, 8, 3, 2, 2, 2, 19, 9, 3, 2, 2, 2, 19, 10, 3, 2, 2, 2, 19, 11, 3, 2, 2, 2, 19, 15, 3, 2, 2, 2, 19, 17, 3, 2, 2, 2, 20, 88, 3, 2, 2, 2, 21, 22, 12, 19, 2, 2, 22, 23, 7, 21, 2, 2, 23, 87, 5, 2, 2, 20, 24, 25, 12, 17, 2, 2, 25, 26, 9, 3, 2, 2, 26, 87, 5, 2, 2, 18, 27, 28, 12, 16, 2, 2, 28, 29, 9, 4, 2, 2, 29, 87, 5, 2, 2, 17, 30, 31, 12, 15, 2, 2, 31, 32, 9, 5, 2, 2, 32, 87, 5, 2, 2, 16, 33, 34, 12, 12, 2, 2, 34, 35, 9, 6, 2, 2, 35, 36, 9, 7, 2, 2, 36, 37, 9, 6, 2, 2, 37, 87, 5, 2, 2, 13, 38, 39, 12, 11, 2, 2, 39, 40, 9, 8, 2, 2, 40, 41, 9, 7, 2, 2, 41, 42, 9, 8, 2, 2, 42, 87, 5, 2, 2, 12, 43, 44, 12, 10, 2, 2, 44, 45, 9, 9, 2, 2, 45, 87, 5, 2, 2, 11, 46, 47, 12, 9, 2, 2, 47, 48, 9, 10, 2, 2, 48, 87, 5, 2, 2, 10, 49, 50, 12, 8, 2, 2, 50, 51, 7, 24, 2, 2, 51, 87, 5, 2, 2, 9, 52, 53, 12, 7, 2, 2, 53, 54, 7, 26, 2, 2, 54, 87, 5, 2, 2, 8, 55, 56, 12, 6, 2, 2, 56, 57, 7, 25, 2, 2, 57, 87, 5, 2, 2, 7, 58, 59, 12, 5, 2, 2, 59, 60, 7, 27, 2, 2, 60, 87, 5, 2, 2, 6, 61, 62, 12, 4, 2, 2, 62, 63, 7, 28, 2, 2, 63, 87, 5, 2, 2, 5, 64, 65, 12, 20, 2, 2, 65, 66, 7, 14, 2, 2, 66, 87, 7, 38, 2, 2, 67, 68, 12, 14, 2, 2, 68, 69, 9, 11, 2, 2, 69, 70, 7, 5, 2, 2, 70, 75, 5, 2, 2, 2, 71, 72, 7, 6, 2, 2, 72, 74, 5, 2, 2, 2, 73, 71, 3, 2, 2, 2, 74, 77, 3, 2, 2, 2, 75, 73, 3, 2, 2, 2, 75, 76, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 78, 80, 7, 6, 2, 2, 79, 78, 3, 2, 2, 2, 79, 80, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 82, 7, 7, 2, 2, 82, 87, 3, 2, 2, 2, 83, 84, 12, 13, 2, 2, 84, 85, 9, 11, 2, 2, 85, 87, 7, 33, 2, 2, 86, 21, 3, 2, 2, 2, 86, 24, 3, 2, 2, 2, 86, 27, 3, 2, 2, 2, 86, 30, 3, 2, 2, 2, 86, 33, 3, 2, 2, 2, 86, 38, 3, 2, 2, 2, 86, 43, 3, 2, 2, 2, 86, 46, 3, 2, 2, 2, 86, 49, 3, 2, 2, 2, 86, 52, 3, 2, 2, 2, 86, 55, 3, 2, 2, 2, 86, 58, 3, 2, 2, 2, 86, 61, 3, 2, 2, 2, 86, 64, 3, 2, 2, 2, 86, 67, 3, 2, 2, 2, 86, 83, 3, 2, 2, 2, 87, 90, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 3, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 7, 19, 75, 79, 86, 88] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 42, 99, 4, 2, 9, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 27, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, 2, 81, 10, 2, 12, 2, 14, 2, 84, 11, 2, 3, 2, 5, 2, 87, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, 2, 94, 10, 2, 12, 2, 14, 2, 97, 11, 2, 3, 2, 2, 3, 2, 3, 2, 2, 12, 4, 2, 16, 17, 29, 30, 3, 2, 18, 20, 3, 2, 16, 17, 3, 2, 22, 23, 3, 2, 8, 9, 4, 2, 38, 38, 40, 40, 3, 2, 10, 11, 3, 2, 8, 11, 3, 2, 12, 13, 3, 2, 31, 32, 2, 124, 2, 26, 3, 2, 2, 2, 4, 5, 8, 2, 1, 2, 5, 27, 7, 36, 2, 2, 6, 27, 7, 37, 2, 2, 7, 27, 7, 35, 2, 2, 8, 27, 7, 39, 2, 2, 9, 27, 7, 38, 2, 2, 10, 27, 7, 40, 2, 2, 11, 12, 7, 3, 2, 2, 12, 13, 5, 2, 2, 2, 13, 14, 7, 4, 2, 2, 14, 27, 3, 2, 2, 2, 15, 16, 9, 2, 2, 2, 16, 27, 5, 2, 2, 19, 17, 18, 7, 34, 2, 2, 18, 19, 7, 3, 2, 2, 19, 20, 5, 2, 2, 2, 20, 21, 7, 6, 2, 2, 21, 22, 5, 2, 2, 2, 22, 23, 7, 4, 2, 2, 23, 27, 3, 2, 2, 2, 24, 25, 7, 15, 2, 2, 25, 27, 5, 2, 2, 3, 26, 4, 3, 2, 2, 2, 26, 6, 3, 2, 2, 2, 26, 7, 3, 2, 2, 2, 26, 8, 3, 2, 2, 2, 26, 9, 3, 2, 2, 2, 26, 10, 3, 2, 2, 2, 26, 11, 3, 2, 2, 2, 26, 15, 3, 2, 2, 2, 26, 17, 3, 2, 2, 2, 26, 24, 3, 2, 2, 2, 27, 95, 3, 2, 2, 2, 28, 29, 12, 20, 2, 2, 29, 30, 7, 21, 2, 2, 30, 94, 5, 2, 2, 21, 31, 32, 12, 18, 2, 2, 32, 33, 9, 3, 2, 2, 33, 94, 5, 2, 2, 19, 34, 35, 12, 17, 2, 2, 35, 36, 9, 4, 2, 2, 36, 94, 5, 2, 2, 18, 37, 38, 12, 16, 2, 2, 38, 39, 9, 5, 2, 2, 39, 94, 5, 2, 2, 17, 40, 41, 12, 12, 2, 2, 41, 42, 9, 6, 2, 2, 42, 43, 9, 7, 2, 2, 43, 44, 9, 6, 2, 2, 44, 94, 5, 2, 2, 13, 45, 46, 12, 11, 2, 2, 46, 47, 9, 8, 2, 2, 47, 48, 9, 7, 2, 2, 48, 49, 9, 8, 2, 2, 49, 94, 5, 2, 2, 12, 50, 51, 12, 10, 2, 2, 51, 52, 9, 9, 2, 2, 52, 94, 5, 2, 2, 11, 53, 54, 12, 9, 2, 2, 54, 55, 9, 10, 2, 2, 55, 94, 5, 2, 2, 10, 56, 57, 12, 8, 2, 2, 57, 58, 7, 24, 2, 2, 58, 94, 5, 2, 2, 9, 59, 60, 12, 7, 2, 2, 60, 61, 7, 26, 2, 2, 61, 94, 5, 2, 2, 8, 62, 63, 12, 6, 2, 2, 63, 64, 7, 25, 2, 2, 64, 94, 5, 2, 2, 7, 65, 66, 12, 5, 2, 2, 66, 67, 7, 27, 2, 2, 67, 94, 5, 2, 2, 6, 68, 69, 12, 4, 2, 2, 69, 70, 7, 28, 2, 2, 70, 94, 5, 2, 2, 5, 71, 72, 12, 21, 2, 2, 72, 73, 7, 14, 2, 2, 73, 94, 7, 39, 2, 2, 74, 75, 12, 15, 2, 2, 75, 76, 9, 11, 2, 2, 76, 77, 7, 5, 2, 2, 77, 82, 5, 2, 2, 2, 78, 79, 7, 6, 2, 2, 79, 81, 5, 2, 2, 2, 80, 78, 3, 2, 2, 2, 81, 84, 3, 2, 2, 2, 82, 80, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 86, 3, 2, 2, 2, 84, 82, 3, 2, 2, 2, 85, 87, 7, 6, 2, 2, 86, 85, 3, 2, 2, 2, 86, 87, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 89, 7, 7, 2, 2, 89, 94, 3, 2, 2, 2, 90, 91, 12, 14, 2, 2, 91, 92, 9, 11, 2, 2, 92, 94, 7, 33, 2, 2, 93, 28, 3, 2, 2, 2, 93, 31, 3, 2, 2, 2, 93, 34, 3, 2, 2, 2, 93, 37, 3, 2, 2, 2, 93, 40, 3, 2, 2, 2, 93, 45, 3, 2, 2, 2, 93, 50, 3, 2, 2, 2, 93, 53, 3, 2, 2, 2, 93, 56, 3, 2, 2, 2, 93, 59, 3, 2, 2, 2, 93, 62, 3, 2, 2, 2, 93, 65, 3, 2, 2, 2, 93, 68, 3, 2, 2, 2, 93, 71, 3, 2, 2, 2, 93, 74, 3, 2, 2, 2, 93, 90, 3, 2, 2, 2, 94, 97, 3, 2, 2, 2, 95, 93, 3, 2, 2, 2, 95, 96, 3, 2, 2, 2, 96, 3, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 7, 26, 82, 86, 93, 95] \ No newline at end of file diff --git a/internal/parser/planparserv2/generated/Plan.tokens b/internal/parser/planparserv2/generated/Plan.tokens index 267fe7d82b..d8456d3b61 100644 --- a/internal/parser/planparserv2/generated/Plan.tokens +++ b/internal/parser/planparserv2/generated/Plan.tokens @@ -29,14 +29,15 @@ NOT=28 IN=29 NIN=30 EmptyTerm=31 -BooleanConstant=32 -IntegerConstant=33 -FloatingConstant=34 -Identifier=35 -StringLiteral=36 -JSONIdentifier=37 -Whitespace=38 -Newline=39 +JSONContains=32 +BooleanConstant=33 +IntegerConstant=34 +FloatingConstant=35 +Identifier=36 +StringLiteral=37 +JSONIdentifier=38 +Whitespace=39 +Newline=40 '('=1 ')'=2 '['=3 @@ -62,3 +63,4 @@ Newline=39 '~'=27 'in'=29 'not in'=30 +'json_contains'=32 diff --git a/internal/parser/planparserv2/generated/PlanLexer.interp b/internal/parser/planparserv2/generated/PlanLexer.interp index b82c1be850..28a5a41da2 100644 --- a/internal/parser/planparserv2/generated/PlanLexer.interp +++ b/internal/parser/planparserv2/generated/PlanLexer.interp @@ -31,6 +31,7 @@ null 'in' 'not in' null +'json_contains' null null null @@ -73,6 +74,7 @@ NOT IN NIN EmptyTerm +JSONContains BooleanConstant IntegerConstant FloatingConstant @@ -114,6 +116,7 @@ NOT IN NIN EmptyTerm +JSONContains BooleanConstant IntegerConstant FloatingConstant @@ -156,4 +159,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 41, 508, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 166, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 180, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 212, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 218, 10, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 226, 10, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 7, 32, 241, 10, 32, 12, 32, 14, 32, 244, 11, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 275, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 281, 10, 34, 3, 35, 3, 35, 5, 35, 285, 10, 35, 3, 36, 3, 36, 3, 36, 7, 36, 290, 10, 36, 12, 36, 14, 36, 293, 11, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 300, 10, 36, 3, 37, 5, 37, 303, 10, 37, 3, 37, 3, 37, 5, 37, 307, 10, 37, 3, 37, 3, 37, 3, 37, 5, 37, 312, 10, 37, 3, 37, 5, 37, 315, 10, 37, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 321, 10, 38, 3, 38, 3, 38, 6, 38, 325, 10, 38, 13, 38, 14, 38, 326, 3, 39, 3, 39, 3, 39, 5, 39, 332, 10, 39, 3, 40, 6, 40, 335, 10, 40, 13, 40, 14, 40, 336, 3, 41, 6, 41, 340, 10, 41, 13, 41, 14, 41, 341, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 351, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 360, 10, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 6, 46, 369, 10, 46, 13, 46, 14, 46, 370, 3, 47, 3, 47, 7, 47, 375, 10, 47, 12, 47, 14, 47, 378, 11, 47, 3, 47, 5, 47, 381, 10, 47, 3, 48, 3, 48, 7, 48, 385, 10, 48, 12, 48, 14, 48, 388, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 415, 10, 54, 3, 55, 3, 55, 5, 55, 419, 10, 55, 3, 55, 3, 55, 3, 55, 5, 55, 424, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 430, 10, 56, 3, 56, 3, 56, 3, 57, 5, 57, 435, 10, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 5, 57, 442, 10, 57, 3, 58, 3, 58, 5, 58, 446, 10, 58, 3, 58, 3, 58, 3, 59, 6, 59, 451, 10, 59, 13, 59, 14, 59, 452, 3, 60, 5, 60, 456, 10, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 5, 60, 463, 10, 60, 3, 61, 6, 61, 466, 10, 61, 13, 61, 14, 61, 467, 3, 62, 3, 62, 5, 62, 472, 10, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 5, 63, 481, 10, 63, 3, 63, 5, 63, 484, 10, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 5, 63, 491, 10, 63, 3, 64, 6, 64, 494, 10, 64, 13, 64, 14, 64, 495, 3, 64, 3, 64, 3, 65, 3, 65, 5, 65, 502, 10, 65, 3, 65, 5, 65, 505, 10, 65, 3, 65, 3, 65, 2, 2, 66, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 2, 79, 2, 81, 2, 83, 2, 85, 2, 87, 2, 89, 2, 91, 2, 93, 2, 95, 2, 97, 2, 99, 2, 101, 2, 103, 2, 105, 2, 107, 2, 109, 2, 111, 2, 113, 2, 115, 2, 117, 2, 119, 2, 121, 2, 123, 2, 125, 2, 127, 40, 129, 41, 3, 2, 18, 5, 2, 78, 78, 87, 87, 119, 119, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 6, 2, 12, 12, 15, 15, 41, 41, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 3, 2, 50, 59, 4, 2, 68, 68, 100, 100, 3, 2, 50, 51, 4, 2, 90, 90, 122, 122, 3, 2, 51, 59, 3, 2, 50, 57, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 82, 82, 114, 114, 12, 2, 36, 36, 41, 41, 65, 65, 94, 94, 99, 100, 104, 104, 112, 112, 116, 116, 118, 118, 120, 120, 4, 2, 11, 11, 34, 34, 2, 540, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 3, 131, 3, 2, 2, 2, 5, 133, 3, 2, 2, 2, 7, 135, 3, 2, 2, 2, 9, 137, 3, 2, 2, 2, 11, 139, 3, 2, 2, 2, 13, 141, 3, 2, 2, 2, 15, 143, 3, 2, 2, 2, 17, 146, 3, 2, 2, 2, 19, 148, 3, 2, 2, 2, 21, 151, 3, 2, 2, 2, 23, 154, 3, 2, 2, 2, 25, 165, 3, 2, 2, 2, 27, 179, 3, 2, 2, 2, 29, 181, 3, 2, 2, 2, 31, 183, 3, 2, 2, 2, 33, 185, 3, 2, 2, 2, 35, 187, 3, 2, 2, 2, 37, 189, 3, 2, 2, 2, 39, 191, 3, 2, 2, 2, 41, 194, 3, 2, 2, 2, 43, 197, 3, 2, 2, 2, 45, 200, 3, 2, 2, 2, 47, 202, 3, 2, 2, 2, 49, 204, 3, 2, 2, 2, 51, 211, 3, 2, 2, 2, 53, 217, 3, 2, 2, 2, 55, 219, 3, 2, 2, 2, 57, 225, 3, 2, 2, 2, 59, 227, 3, 2, 2, 2, 61, 230, 3, 2, 2, 2, 63, 237, 3, 2, 2, 2, 65, 274, 3, 2, 2, 2, 67, 280, 3, 2, 2, 2, 69, 284, 3, 2, 2, 2, 71, 299, 3, 2, 2, 2, 73, 302, 3, 2, 2, 2, 75, 316, 3, 2, 2, 2, 77, 331, 3, 2, 2, 2, 79, 334, 3, 2, 2, 2, 81, 339, 3, 2, 2, 2, 83, 350, 3, 2, 2, 2, 85, 359, 3, 2, 2, 2, 87, 361, 3, 2, 2, 2, 89, 363, 3, 2, 2, 2, 91, 365, 3, 2, 2, 2, 93, 380, 3, 2, 2, 2, 95, 382, 3, 2, 2, 2, 97, 389, 3, 2, 2, 2, 99, 393, 3, 2, 2, 2, 101, 395, 3, 2, 2, 2, 103, 397, 3, 2, 2, 2, 105, 399, 3, 2, 2, 2, 107, 414, 3, 2, 2, 2, 109, 423, 3, 2, 2, 2, 111, 425, 3, 2, 2, 2, 113, 441, 3, 2, 2, 2, 115, 443, 3, 2, 2, 2, 117, 450, 3, 2, 2, 2, 119, 462, 3, 2, 2, 2, 121, 465, 3, 2, 2, 2, 123, 469, 3, 2, 2, 2, 125, 490, 3, 2, 2, 2, 127, 493, 3, 2, 2, 2, 129, 504, 3, 2, 2, 2, 131, 132, 7, 42, 2, 2, 132, 4, 3, 2, 2, 2, 133, 134, 7, 43, 2, 2, 134, 6, 3, 2, 2, 2, 135, 136, 7, 93, 2, 2, 136, 8, 3, 2, 2, 2, 137, 138, 7, 46, 2, 2, 138, 10, 3, 2, 2, 2, 139, 140, 7, 95, 2, 2, 140, 12, 3, 2, 2, 2, 141, 142, 7, 62, 2, 2, 142, 14, 3, 2, 2, 2, 143, 144, 7, 62, 2, 2, 144, 145, 7, 63, 2, 2, 145, 16, 3, 2, 2, 2, 146, 147, 7, 64, 2, 2, 147, 18, 3, 2, 2, 2, 148, 149, 7, 64, 2, 2, 149, 150, 7, 63, 2, 2, 150, 20, 3, 2, 2, 2, 151, 152, 7, 63, 2, 2, 152, 153, 7, 63, 2, 2, 153, 22, 3, 2, 2, 2, 154, 155, 7, 35, 2, 2, 155, 156, 7, 63, 2, 2, 156, 24, 3, 2, 2, 2, 157, 158, 7, 110, 2, 2, 158, 159, 7, 107, 2, 2, 159, 160, 7, 109, 2, 2, 160, 166, 7, 103, 2, 2, 161, 162, 7, 78, 2, 2, 162, 163, 7, 75, 2, 2, 163, 164, 7, 77, 2, 2, 164, 166, 7, 71, 2, 2, 165, 157, 3, 2, 2, 2, 165, 161, 3, 2, 2, 2, 166, 26, 3, 2, 2, 2, 167, 168, 7, 103, 2, 2, 168, 169, 7, 122, 2, 2, 169, 170, 7, 107, 2, 2, 170, 171, 7, 117, 2, 2, 171, 172, 7, 118, 2, 2, 172, 180, 7, 117, 2, 2, 173, 174, 7, 71, 2, 2, 174, 175, 7, 90, 2, 2, 175, 176, 7, 75, 2, 2, 176, 177, 7, 85, 2, 2, 177, 178, 7, 86, 2, 2, 178, 180, 7, 85, 2, 2, 179, 167, 3, 2, 2, 2, 179, 173, 3, 2, 2, 2, 180, 28, 3, 2, 2, 2, 181, 182, 7, 45, 2, 2, 182, 30, 3, 2, 2, 2, 183, 184, 7, 47, 2, 2, 184, 32, 3, 2, 2, 2, 185, 186, 7, 44, 2, 2, 186, 34, 3, 2, 2, 2, 187, 188, 7, 49, 2, 2, 188, 36, 3, 2, 2, 2, 189, 190, 7, 39, 2, 2, 190, 38, 3, 2, 2, 2, 191, 192, 7, 44, 2, 2, 192, 193, 7, 44, 2, 2, 193, 40, 3, 2, 2, 2, 194, 195, 7, 62, 2, 2, 195, 196, 7, 62, 2, 2, 196, 42, 3, 2, 2, 2, 197, 198, 7, 64, 2, 2, 198, 199, 7, 64, 2, 2, 199, 44, 3, 2, 2, 2, 200, 201, 7, 40, 2, 2, 201, 46, 3, 2, 2, 2, 202, 203, 7, 126, 2, 2, 203, 48, 3, 2, 2, 2, 204, 205, 7, 96, 2, 2, 205, 50, 3, 2, 2, 2, 206, 207, 7, 40, 2, 2, 207, 212, 7, 40, 2, 2, 208, 209, 7, 99, 2, 2, 209, 210, 7, 112, 2, 2, 210, 212, 7, 102, 2, 2, 211, 206, 3, 2, 2, 2, 211, 208, 3, 2, 2, 2, 212, 52, 3, 2, 2, 2, 213, 214, 7, 126, 2, 2, 214, 218, 7, 126, 2, 2, 215, 216, 7, 113, 2, 2, 216, 218, 7, 116, 2, 2, 217, 213, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 218, 54, 3, 2, 2, 2, 219, 220, 7, 128, 2, 2, 220, 56, 3, 2, 2, 2, 221, 226, 7, 35, 2, 2, 222, 223, 7, 112, 2, 2, 223, 224, 7, 113, 2, 2, 224, 226, 7, 118, 2, 2, 225, 221, 3, 2, 2, 2, 225, 222, 3, 2, 2, 2, 226, 58, 3, 2, 2, 2, 227, 228, 7, 107, 2, 2, 228, 229, 7, 112, 2, 2, 229, 60, 3, 2, 2, 2, 230, 231, 7, 112, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 118, 2, 2, 233, 234, 7, 34, 2, 2, 234, 235, 7, 107, 2, 2, 235, 236, 7, 112, 2, 2, 236, 62, 3, 2, 2, 2, 237, 242, 7, 93, 2, 2, 238, 241, 5, 127, 64, 2, 239, 241, 5, 129, 65, 2, 240, 238, 3, 2, 2, 2, 240, 239, 3, 2, 2, 2, 241, 244, 3, 2, 2, 2, 242, 240, 3, 2, 2, 2, 242, 243, 3, 2, 2, 2, 243, 245, 3, 2, 2, 2, 244, 242, 3, 2, 2, 2, 245, 246, 7, 95, 2, 2, 246, 64, 3, 2, 2, 2, 247, 248, 7, 118, 2, 2, 248, 249, 7, 116, 2, 2, 249, 250, 7, 119, 2, 2, 250, 275, 7, 103, 2, 2, 251, 252, 7, 86, 2, 2, 252, 253, 7, 116, 2, 2, 253, 254, 7, 119, 2, 2, 254, 275, 7, 103, 2, 2, 255, 256, 7, 86, 2, 2, 256, 257, 7, 84, 2, 2, 257, 258, 7, 87, 2, 2, 258, 275, 7, 71, 2, 2, 259, 260, 7, 104, 2, 2, 260, 261, 7, 99, 2, 2, 261, 262, 7, 110, 2, 2, 262, 263, 7, 117, 2, 2, 263, 275, 7, 103, 2, 2, 264, 265, 7, 72, 2, 2, 265, 266, 7, 99, 2, 2, 266, 267, 7, 110, 2, 2, 267, 268, 7, 117, 2, 2, 268, 275, 7, 103, 2, 2, 269, 270, 7, 72, 2, 2, 270, 271, 7, 67, 2, 2, 271, 272, 7, 78, 2, 2, 272, 273, 7, 85, 2, 2, 273, 275, 7, 71, 2, 2, 274, 247, 3, 2, 2, 2, 274, 251, 3, 2, 2, 2, 274, 255, 3, 2, 2, 2, 274, 259, 3, 2, 2, 2, 274, 264, 3, 2, 2, 2, 274, 269, 3, 2, 2, 2, 275, 66, 3, 2, 2, 2, 276, 281, 5, 93, 47, 2, 277, 281, 5, 95, 48, 2, 278, 281, 5, 97, 49, 2, 279, 281, 5, 91, 46, 2, 280, 276, 3, 2, 2, 2, 280, 277, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 279, 3, 2, 2, 2, 281, 68, 3, 2, 2, 2, 282, 285, 5, 109, 55, 2, 283, 285, 5, 111, 56, 2, 284, 282, 3, 2, 2, 2, 284, 283, 3, 2, 2, 2, 285, 70, 3, 2, 2, 2, 286, 291, 5, 87, 44, 2, 287, 290, 5, 87, 44, 2, 288, 290, 5, 89, 45, 2, 289, 287, 3, 2, 2, 2, 289, 288, 3, 2, 2, 2, 290, 293, 3, 2, 2, 2, 291, 289, 3, 2, 2, 2, 291, 292, 3, 2, 2, 2, 292, 300, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 294, 295, 7, 38, 2, 2, 295, 296, 7, 111, 2, 2, 296, 297, 7, 103, 2, 2, 297, 298, 7, 118, 2, 2, 298, 300, 7, 99, 2, 2, 299, 286, 3, 2, 2, 2, 299, 294, 3, 2, 2, 2, 300, 72, 3, 2, 2, 2, 301, 303, 5, 77, 39, 2, 302, 301, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 314, 3, 2, 2, 2, 304, 306, 7, 36, 2, 2, 305, 307, 5, 79, 40, 2, 306, 305, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 315, 7, 36, 2, 2, 309, 311, 7, 41, 2, 2, 310, 312, 5, 81, 41, 2, 311, 310, 3, 2, 2, 2, 311, 312, 3, 2, 2, 2, 312, 313, 3, 2, 2, 2, 313, 315, 7, 41, 2, 2, 314, 304, 3, 2, 2, 2, 314, 309, 3, 2, 2, 2, 315, 74, 3, 2, 2, 2, 316, 324, 5, 71, 36, 2, 317, 320, 7, 93, 2, 2, 318, 321, 5, 73, 37, 2, 319, 321, 5, 93, 47, 2, 320, 318, 3, 2, 2, 2, 320, 319, 3, 2, 2, 2, 321, 322, 3, 2, 2, 2, 322, 323, 7, 95, 2, 2, 323, 325, 3, 2, 2, 2, 324, 317, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 324, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 76, 3, 2, 2, 2, 328, 329, 7, 119, 2, 2, 329, 332, 7, 58, 2, 2, 330, 332, 9, 2, 2, 2, 331, 328, 3, 2, 2, 2, 331, 330, 3, 2, 2, 2, 332, 78, 3, 2, 2, 2, 333, 335, 5, 83, 42, 2, 334, 333, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 334, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 80, 3, 2, 2, 2, 338, 340, 5, 85, 43, 2, 339, 338, 3, 2, 2, 2, 340, 341, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 82, 3, 2, 2, 2, 343, 351, 10, 3, 2, 2, 344, 351, 5, 125, 63, 2, 345, 346, 7, 94, 2, 2, 346, 351, 7, 12, 2, 2, 347, 348, 7, 94, 2, 2, 348, 349, 7, 15, 2, 2, 349, 351, 7, 12, 2, 2, 350, 343, 3, 2, 2, 2, 350, 344, 3, 2, 2, 2, 350, 345, 3, 2, 2, 2, 350, 347, 3, 2, 2, 2, 351, 84, 3, 2, 2, 2, 352, 360, 10, 4, 2, 2, 353, 360, 5, 125, 63, 2, 354, 355, 7, 94, 2, 2, 355, 360, 7, 12, 2, 2, 356, 357, 7, 94, 2, 2, 357, 358, 7, 15, 2, 2, 358, 360, 7, 12, 2, 2, 359, 352, 3, 2, 2, 2, 359, 353, 3, 2, 2, 2, 359, 354, 3, 2, 2, 2, 359, 356, 3, 2, 2, 2, 360, 86, 3, 2, 2, 2, 361, 362, 9, 5, 2, 2, 362, 88, 3, 2, 2, 2, 363, 364, 9, 6, 2, 2, 364, 90, 3, 2, 2, 2, 365, 366, 7, 50, 2, 2, 366, 368, 9, 7, 2, 2, 367, 369, 9, 8, 2, 2, 368, 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, 3, 2, 2, 2, 371, 92, 3, 2, 2, 2, 372, 376, 5, 99, 50, 2, 373, 375, 5, 89, 45, 2, 374, 373, 3, 2, 2, 2, 375, 378, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, 376, 377, 3, 2, 2, 2, 377, 381, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 379, 381, 7, 50, 2, 2, 380, 372, 3, 2, 2, 2, 380, 379, 3, 2, 2, 2, 381, 94, 3, 2, 2, 2, 382, 386, 7, 50, 2, 2, 383, 385, 5, 101, 51, 2, 384, 383, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 96, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 390, 7, 50, 2, 2, 390, 391, 9, 9, 2, 2, 391, 392, 5, 121, 61, 2, 392, 98, 3, 2, 2, 2, 393, 394, 9, 10, 2, 2, 394, 100, 3, 2, 2, 2, 395, 396, 9, 11, 2, 2, 396, 102, 3, 2, 2, 2, 397, 398, 9, 12, 2, 2, 398, 104, 3, 2, 2, 2, 399, 400, 5, 103, 52, 2, 400, 401, 5, 103, 52, 2, 401, 402, 5, 103, 52, 2, 402, 403, 5, 103, 52, 2, 403, 106, 3, 2, 2, 2, 404, 405, 7, 94, 2, 2, 405, 406, 7, 119, 2, 2, 406, 407, 3, 2, 2, 2, 407, 415, 5, 105, 53, 2, 408, 409, 7, 94, 2, 2, 409, 410, 7, 87, 2, 2, 410, 411, 3, 2, 2, 2, 411, 412, 5, 105, 53, 2, 412, 413, 5, 105, 53, 2, 413, 415, 3, 2, 2, 2, 414, 404, 3, 2, 2, 2, 414, 408, 3, 2, 2, 2, 415, 108, 3, 2, 2, 2, 416, 418, 5, 113, 57, 2, 417, 419, 5, 115, 58, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 424, 3, 2, 2, 2, 420, 421, 5, 117, 59, 2, 421, 422, 5, 115, 58, 2, 422, 424, 3, 2, 2, 2, 423, 416, 3, 2, 2, 2, 423, 420, 3, 2, 2, 2, 424, 110, 3, 2, 2, 2, 425, 426, 7, 50, 2, 2, 426, 429, 9, 9, 2, 2, 427, 430, 5, 119, 60, 2, 428, 430, 5, 121, 61, 2, 429, 427, 3, 2, 2, 2, 429, 428, 3, 2, 2, 2, 430, 431, 3, 2, 2, 2, 431, 432, 5, 123, 62, 2, 432, 112, 3, 2, 2, 2, 433, 435, 5, 117, 59, 2, 434, 433, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 437, 7, 48, 2, 2, 437, 442, 5, 117, 59, 2, 438, 439, 5, 117, 59, 2, 439, 440, 7, 48, 2, 2, 440, 442, 3, 2, 2, 2, 441, 434, 3, 2, 2, 2, 441, 438, 3, 2, 2, 2, 442, 114, 3, 2, 2, 2, 443, 445, 9, 13, 2, 2, 444, 446, 9, 14, 2, 2, 445, 444, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 5, 117, 59, 2, 448, 116, 3, 2, 2, 2, 449, 451, 5, 89, 45, 2, 450, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 452, 453, 3, 2, 2, 2, 453, 118, 3, 2, 2, 2, 454, 456, 5, 121, 61, 2, 455, 454, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 458, 7, 48, 2, 2, 458, 463, 5, 121, 61, 2, 459, 460, 5, 121, 61, 2, 460, 461, 7, 48, 2, 2, 461, 463, 3, 2, 2, 2, 462, 455, 3, 2, 2, 2, 462, 459, 3, 2, 2, 2, 463, 120, 3, 2, 2, 2, 464, 466, 5, 103, 52, 2, 465, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 122, 3, 2, 2, 2, 469, 471, 9, 15, 2, 2, 470, 472, 9, 14, 2, 2, 471, 470, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 474, 5, 117, 59, 2, 474, 124, 3, 2, 2, 2, 475, 476, 7, 94, 2, 2, 476, 491, 9, 16, 2, 2, 477, 478, 7, 94, 2, 2, 478, 480, 5, 101, 51, 2, 479, 481, 5, 101, 51, 2, 480, 479, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 483, 3, 2, 2, 2, 482, 484, 5, 101, 51, 2, 483, 482, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 491, 3, 2, 2, 2, 485, 486, 7, 94, 2, 2, 486, 487, 7, 122, 2, 2, 487, 488, 3, 2, 2, 2, 488, 491, 5, 121, 61, 2, 489, 491, 5, 107, 54, 2, 490, 475, 3, 2, 2, 2, 490, 477, 3, 2, 2, 2, 490, 485, 3, 2, 2, 2, 490, 489, 3, 2, 2, 2, 491, 126, 3, 2, 2, 2, 492, 494, 9, 17, 2, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 8, 64, 2, 2, 498, 128, 3, 2, 2, 2, 499, 501, 7, 15, 2, 2, 500, 502, 7, 12, 2, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 505, 7, 12, 2, 2, 504, 499, 3, 2, 2, 2, 504, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 8, 65, 2, 2, 507, 130, 3, 2, 2, 2, 49, 2, 165, 179, 211, 217, 225, 240, 242, 274, 280, 284, 289, 291, 299, 302, 306, 311, 314, 320, 326, 331, 336, 341, 350, 359, 370, 376, 380, 386, 414, 418, 423, 429, 434, 441, 445, 452, 455, 462, 467, 471, 480, 483, 490, 495, 501, 504, 3, 8, 2, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 42, 524, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 168, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 182, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 214, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 220, 10, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 228, 10, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 7, 32, 243, 10, 32, 12, 32, 14, 32, 246, 11, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 291, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 297, 10, 35, 3, 36, 3, 36, 5, 36, 301, 10, 36, 3, 37, 3, 37, 3, 37, 7, 37, 306, 10, 37, 12, 37, 14, 37, 309, 11, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 316, 10, 37, 3, 38, 5, 38, 319, 10, 38, 3, 38, 3, 38, 5, 38, 323, 10, 38, 3, 38, 3, 38, 3, 38, 5, 38, 328, 10, 38, 3, 38, 5, 38, 331, 10, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 337, 10, 39, 3, 39, 3, 39, 6, 39, 341, 10, 39, 13, 39, 14, 39, 342, 3, 40, 3, 40, 3, 40, 5, 40, 348, 10, 40, 3, 41, 6, 41, 351, 10, 41, 13, 41, 14, 41, 352, 3, 42, 6, 42, 356, 10, 42, 13, 42, 14, 42, 357, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 367, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 376, 10, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 6, 47, 385, 10, 47, 13, 47, 14, 47, 386, 3, 48, 3, 48, 7, 48, 391, 10, 48, 12, 48, 14, 48, 394, 11, 48, 3, 48, 5, 48, 397, 10, 48, 3, 49, 3, 49, 7, 49, 401, 10, 49, 12, 49, 14, 49, 404, 11, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 431, 10, 55, 3, 56, 3, 56, 5, 56, 435, 10, 56, 3, 56, 3, 56, 3, 56, 5, 56, 440, 10, 56, 3, 57, 3, 57, 3, 57, 3, 57, 5, 57, 446, 10, 57, 3, 57, 3, 57, 3, 58, 5, 58, 451, 10, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 5, 58, 458, 10, 58, 3, 59, 3, 59, 5, 59, 462, 10, 59, 3, 59, 3, 59, 3, 60, 6, 60, 467, 10, 60, 13, 60, 14, 60, 468, 3, 61, 5, 61, 472, 10, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 5, 61, 479, 10, 61, 3, 62, 6, 62, 482, 10, 62, 13, 62, 14, 62, 483, 3, 63, 3, 63, 5, 63, 488, 10, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 497, 10, 64, 3, 64, 5, 64, 500, 10, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 5, 64, 507, 10, 64, 3, 65, 6, 65, 510, 10, 65, 13, 65, 14, 65, 511, 3, 65, 3, 65, 3, 66, 3, 66, 5, 66, 518, 10, 66, 3, 66, 5, 66, 521, 10, 66, 3, 66, 3, 66, 2, 2, 67, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 2, 81, 2, 83, 2, 85, 2, 87, 2, 89, 2, 91, 2, 93, 2, 95, 2, 97, 2, 99, 2, 101, 2, 103, 2, 105, 2, 107, 2, 109, 2, 111, 2, 113, 2, 115, 2, 117, 2, 119, 2, 121, 2, 123, 2, 125, 2, 127, 2, 129, 41, 131, 42, 3, 2, 18, 5, 2, 78, 78, 87, 87, 119, 119, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 6, 2, 12, 12, 15, 15, 41, 41, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 3, 2, 50, 59, 4, 2, 68, 68, 100, 100, 3, 2, 50, 51, 4, 2, 90, 90, 122, 122, 3, 2, 51, 59, 3, 2, 50, 57, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 82, 82, 114, 114, 12, 2, 36, 36, 41, 41, 65, 65, 94, 94, 99, 100, 104, 104, 112, 112, 116, 116, 118, 118, 120, 120, 4, 2, 11, 11, 34, 34, 2, 556, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 3, 133, 3, 2, 2, 2, 5, 135, 3, 2, 2, 2, 7, 137, 3, 2, 2, 2, 9, 139, 3, 2, 2, 2, 11, 141, 3, 2, 2, 2, 13, 143, 3, 2, 2, 2, 15, 145, 3, 2, 2, 2, 17, 148, 3, 2, 2, 2, 19, 150, 3, 2, 2, 2, 21, 153, 3, 2, 2, 2, 23, 156, 3, 2, 2, 2, 25, 167, 3, 2, 2, 2, 27, 181, 3, 2, 2, 2, 29, 183, 3, 2, 2, 2, 31, 185, 3, 2, 2, 2, 33, 187, 3, 2, 2, 2, 35, 189, 3, 2, 2, 2, 37, 191, 3, 2, 2, 2, 39, 193, 3, 2, 2, 2, 41, 196, 3, 2, 2, 2, 43, 199, 3, 2, 2, 2, 45, 202, 3, 2, 2, 2, 47, 204, 3, 2, 2, 2, 49, 206, 3, 2, 2, 2, 51, 213, 3, 2, 2, 2, 53, 219, 3, 2, 2, 2, 55, 221, 3, 2, 2, 2, 57, 227, 3, 2, 2, 2, 59, 229, 3, 2, 2, 2, 61, 232, 3, 2, 2, 2, 63, 239, 3, 2, 2, 2, 65, 249, 3, 2, 2, 2, 67, 290, 3, 2, 2, 2, 69, 296, 3, 2, 2, 2, 71, 300, 3, 2, 2, 2, 73, 315, 3, 2, 2, 2, 75, 318, 3, 2, 2, 2, 77, 332, 3, 2, 2, 2, 79, 347, 3, 2, 2, 2, 81, 350, 3, 2, 2, 2, 83, 355, 3, 2, 2, 2, 85, 366, 3, 2, 2, 2, 87, 375, 3, 2, 2, 2, 89, 377, 3, 2, 2, 2, 91, 379, 3, 2, 2, 2, 93, 381, 3, 2, 2, 2, 95, 396, 3, 2, 2, 2, 97, 398, 3, 2, 2, 2, 99, 405, 3, 2, 2, 2, 101, 409, 3, 2, 2, 2, 103, 411, 3, 2, 2, 2, 105, 413, 3, 2, 2, 2, 107, 415, 3, 2, 2, 2, 109, 430, 3, 2, 2, 2, 111, 439, 3, 2, 2, 2, 113, 441, 3, 2, 2, 2, 115, 457, 3, 2, 2, 2, 117, 459, 3, 2, 2, 2, 119, 466, 3, 2, 2, 2, 121, 478, 3, 2, 2, 2, 123, 481, 3, 2, 2, 2, 125, 485, 3, 2, 2, 2, 127, 506, 3, 2, 2, 2, 129, 509, 3, 2, 2, 2, 131, 520, 3, 2, 2, 2, 133, 134, 7, 42, 2, 2, 134, 4, 3, 2, 2, 2, 135, 136, 7, 43, 2, 2, 136, 6, 3, 2, 2, 2, 137, 138, 7, 93, 2, 2, 138, 8, 3, 2, 2, 2, 139, 140, 7, 46, 2, 2, 140, 10, 3, 2, 2, 2, 141, 142, 7, 95, 2, 2, 142, 12, 3, 2, 2, 2, 143, 144, 7, 62, 2, 2, 144, 14, 3, 2, 2, 2, 145, 146, 7, 62, 2, 2, 146, 147, 7, 63, 2, 2, 147, 16, 3, 2, 2, 2, 148, 149, 7, 64, 2, 2, 149, 18, 3, 2, 2, 2, 150, 151, 7, 64, 2, 2, 151, 152, 7, 63, 2, 2, 152, 20, 3, 2, 2, 2, 153, 154, 7, 63, 2, 2, 154, 155, 7, 63, 2, 2, 155, 22, 3, 2, 2, 2, 156, 157, 7, 35, 2, 2, 157, 158, 7, 63, 2, 2, 158, 24, 3, 2, 2, 2, 159, 160, 7, 110, 2, 2, 160, 161, 7, 107, 2, 2, 161, 162, 7, 109, 2, 2, 162, 168, 7, 103, 2, 2, 163, 164, 7, 78, 2, 2, 164, 165, 7, 75, 2, 2, 165, 166, 7, 77, 2, 2, 166, 168, 7, 71, 2, 2, 167, 159, 3, 2, 2, 2, 167, 163, 3, 2, 2, 2, 168, 26, 3, 2, 2, 2, 169, 170, 7, 103, 2, 2, 170, 171, 7, 122, 2, 2, 171, 172, 7, 107, 2, 2, 172, 173, 7, 117, 2, 2, 173, 174, 7, 118, 2, 2, 174, 182, 7, 117, 2, 2, 175, 176, 7, 71, 2, 2, 176, 177, 7, 90, 2, 2, 177, 178, 7, 75, 2, 2, 178, 179, 7, 85, 2, 2, 179, 180, 7, 86, 2, 2, 180, 182, 7, 85, 2, 2, 181, 169, 3, 2, 2, 2, 181, 175, 3, 2, 2, 2, 182, 28, 3, 2, 2, 2, 183, 184, 7, 45, 2, 2, 184, 30, 3, 2, 2, 2, 185, 186, 7, 47, 2, 2, 186, 32, 3, 2, 2, 2, 187, 188, 7, 44, 2, 2, 188, 34, 3, 2, 2, 2, 189, 190, 7, 49, 2, 2, 190, 36, 3, 2, 2, 2, 191, 192, 7, 39, 2, 2, 192, 38, 3, 2, 2, 2, 193, 194, 7, 44, 2, 2, 194, 195, 7, 44, 2, 2, 195, 40, 3, 2, 2, 2, 196, 197, 7, 62, 2, 2, 197, 198, 7, 62, 2, 2, 198, 42, 3, 2, 2, 2, 199, 200, 7, 64, 2, 2, 200, 201, 7, 64, 2, 2, 201, 44, 3, 2, 2, 2, 202, 203, 7, 40, 2, 2, 203, 46, 3, 2, 2, 2, 204, 205, 7, 126, 2, 2, 205, 48, 3, 2, 2, 2, 206, 207, 7, 96, 2, 2, 207, 50, 3, 2, 2, 2, 208, 209, 7, 40, 2, 2, 209, 214, 7, 40, 2, 2, 210, 211, 7, 99, 2, 2, 211, 212, 7, 112, 2, 2, 212, 214, 7, 102, 2, 2, 213, 208, 3, 2, 2, 2, 213, 210, 3, 2, 2, 2, 214, 52, 3, 2, 2, 2, 215, 216, 7, 126, 2, 2, 216, 220, 7, 126, 2, 2, 217, 218, 7, 113, 2, 2, 218, 220, 7, 116, 2, 2, 219, 215, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 220, 54, 3, 2, 2, 2, 221, 222, 7, 128, 2, 2, 222, 56, 3, 2, 2, 2, 223, 228, 7, 35, 2, 2, 224, 225, 7, 112, 2, 2, 225, 226, 7, 113, 2, 2, 226, 228, 7, 118, 2, 2, 227, 223, 3, 2, 2, 2, 227, 224, 3, 2, 2, 2, 228, 58, 3, 2, 2, 2, 229, 230, 7, 107, 2, 2, 230, 231, 7, 112, 2, 2, 231, 60, 3, 2, 2, 2, 232, 233, 7, 112, 2, 2, 233, 234, 7, 113, 2, 2, 234, 235, 7, 118, 2, 2, 235, 236, 7, 34, 2, 2, 236, 237, 7, 107, 2, 2, 237, 238, 7, 112, 2, 2, 238, 62, 3, 2, 2, 2, 239, 244, 7, 93, 2, 2, 240, 243, 5, 129, 65, 2, 241, 243, 5, 131, 66, 2, 242, 240, 3, 2, 2, 2, 242, 241, 3, 2, 2, 2, 243, 246, 3, 2, 2, 2, 244, 242, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 247, 3, 2, 2, 2, 246, 244, 3, 2, 2, 2, 247, 248, 7, 95, 2, 2, 248, 64, 3, 2, 2, 2, 249, 250, 7, 108, 2, 2, 250, 251, 7, 117, 2, 2, 251, 252, 7, 113, 2, 2, 252, 253, 7, 112, 2, 2, 253, 254, 7, 97, 2, 2, 254, 255, 7, 101, 2, 2, 255, 256, 7, 113, 2, 2, 256, 257, 7, 112, 2, 2, 257, 258, 7, 118, 2, 2, 258, 259, 7, 99, 2, 2, 259, 260, 7, 107, 2, 2, 260, 261, 7, 112, 2, 2, 261, 262, 7, 117, 2, 2, 262, 66, 3, 2, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 266, 7, 119, 2, 2, 266, 291, 7, 103, 2, 2, 267, 268, 7, 86, 2, 2, 268, 269, 7, 116, 2, 2, 269, 270, 7, 119, 2, 2, 270, 291, 7, 103, 2, 2, 271, 272, 7, 86, 2, 2, 272, 273, 7, 84, 2, 2, 273, 274, 7, 87, 2, 2, 274, 291, 7, 71, 2, 2, 275, 276, 7, 104, 2, 2, 276, 277, 7, 99, 2, 2, 277, 278, 7, 110, 2, 2, 278, 279, 7, 117, 2, 2, 279, 291, 7, 103, 2, 2, 280, 281, 7, 72, 2, 2, 281, 282, 7, 99, 2, 2, 282, 283, 7, 110, 2, 2, 283, 284, 7, 117, 2, 2, 284, 291, 7, 103, 2, 2, 285, 286, 7, 72, 2, 2, 286, 287, 7, 67, 2, 2, 287, 288, 7, 78, 2, 2, 288, 289, 7, 85, 2, 2, 289, 291, 7, 71, 2, 2, 290, 263, 3, 2, 2, 2, 290, 267, 3, 2, 2, 2, 290, 271, 3, 2, 2, 2, 290, 275, 3, 2, 2, 2, 290, 280, 3, 2, 2, 2, 290, 285, 3, 2, 2, 2, 291, 68, 3, 2, 2, 2, 292, 297, 5, 95, 48, 2, 293, 297, 5, 97, 49, 2, 294, 297, 5, 99, 50, 2, 295, 297, 5, 93, 47, 2, 296, 292, 3, 2, 2, 2, 296, 293, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 296, 295, 3, 2, 2, 2, 297, 70, 3, 2, 2, 2, 298, 301, 5, 111, 56, 2, 299, 301, 5, 113, 57, 2, 300, 298, 3, 2, 2, 2, 300, 299, 3, 2, 2, 2, 301, 72, 3, 2, 2, 2, 302, 307, 5, 89, 45, 2, 303, 306, 5, 89, 45, 2, 304, 306, 5, 91, 46, 2, 305, 303, 3, 2, 2, 2, 305, 304, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 316, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 310, 311, 7, 38, 2, 2, 311, 312, 7, 111, 2, 2, 312, 313, 7, 103, 2, 2, 313, 314, 7, 118, 2, 2, 314, 316, 7, 99, 2, 2, 315, 302, 3, 2, 2, 2, 315, 310, 3, 2, 2, 2, 316, 74, 3, 2, 2, 2, 317, 319, 5, 79, 40, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 330, 3, 2, 2, 2, 320, 322, 7, 36, 2, 2, 321, 323, 5, 81, 41, 2, 322, 321, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 331, 7, 36, 2, 2, 325, 327, 7, 41, 2, 2, 326, 328, 5, 83, 42, 2, 327, 326, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 7, 41, 2, 2, 330, 320, 3, 2, 2, 2, 330, 325, 3, 2, 2, 2, 331, 76, 3, 2, 2, 2, 332, 340, 5, 73, 37, 2, 333, 336, 7, 93, 2, 2, 334, 337, 5, 75, 38, 2, 335, 337, 5, 95, 48, 2, 336, 334, 3, 2, 2, 2, 336, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 339, 7, 95, 2, 2, 339, 341, 3, 2, 2, 2, 340, 333, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, 342, 340, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 78, 3, 2, 2, 2, 344, 345, 7, 119, 2, 2, 345, 348, 7, 58, 2, 2, 346, 348, 9, 2, 2, 2, 347, 344, 3, 2, 2, 2, 347, 346, 3, 2, 2, 2, 348, 80, 3, 2, 2, 2, 349, 351, 5, 85, 43, 2, 350, 349, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 350, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 82, 3, 2, 2, 2, 354, 356, 5, 87, 44, 2, 355, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 84, 3, 2, 2, 2, 359, 367, 10, 3, 2, 2, 360, 367, 5, 127, 64, 2, 361, 362, 7, 94, 2, 2, 362, 367, 7, 12, 2, 2, 363, 364, 7, 94, 2, 2, 364, 365, 7, 15, 2, 2, 365, 367, 7, 12, 2, 2, 366, 359, 3, 2, 2, 2, 366, 360, 3, 2, 2, 2, 366, 361, 3, 2, 2, 2, 366, 363, 3, 2, 2, 2, 367, 86, 3, 2, 2, 2, 368, 376, 10, 4, 2, 2, 369, 376, 5, 127, 64, 2, 370, 371, 7, 94, 2, 2, 371, 376, 7, 12, 2, 2, 372, 373, 7, 94, 2, 2, 373, 374, 7, 15, 2, 2, 374, 376, 7, 12, 2, 2, 375, 368, 3, 2, 2, 2, 375, 369, 3, 2, 2, 2, 375, 370, 3, 2, 2, 2, 375, 372, 3, 2, 2, 2, 376, 88, 3, 2, 2, 2, 377, 378, 9, 5, 2, 2, 378, 90, 3, 2, 2, 2, 379, 380, 9, 6, 2, 2, 380, 92, 3, 2, 2, 2, 381, 382, 7, 50, 2, 2, 382, 384, 9, 7, 2, 2, 383, 385, 9, 8, 2, 2, 384, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 94, 3, 2, 2, 2, 388, 392, 5, 101, 51, 2, 389, 391, 5, 91, 46, 2, 390, 389, 3, 2, 2, 2, 391, 394, 3, 2, 2, 2, 392, 390, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 397, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 395, 397, 7, 50, 2, 2, 396, 388, 3, 2, 2, 2, 396, 395, 3, 2, 2, 2, 397, 96, 3, 2, 2, 2, 398, 402, 7, 50, 2, 2, 399, 401, 5, 103, 52, 2, 400, 399, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 98, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, 7, 50, 2, 2, 406, 407, 9, 9, 2, 2, 407, 408, 5, 123, 62, 2, 408, 100, 3, 2, 2, 2, 409, 410, 9, 10, 2, 2, 410, 102, 3, 2, 2, 2, 411, 412, 9, 11, 2, 2, 412, 104, 3, 2, 2, 2, 413, 414, 9, 12, 2, 2, 414, 106, 3, 2, 2, 2, 415, 416, 5, 105, 53, 2, 416, 417, 5, 105, 53, 2, 417, 418, 5, 105, 53, 2, 418, 419, 5, 105, 53, 2, 419, 108, 3, 2, 2, 2, 420, 421, 7, 94, 2, 2, 421, 422, 7, 119, 2, 2, 422, 423, 3, 2, 2, 2, 423, 431, 5, 107, 54, 2, 424, 425, 7, 94, 2, 2, 425, 426, 7, 87, 2, 2, 426, 427, 3, 2, 2, 2, 427, 428, 5, 107, 54, 2, 428, 429, 5, 107, 54, 2, 429, 431, 3, 2, 2, 2, 430, 420, 3, 2, 2, 2, 430, 424, 3, 2, 2, 2, 431, 110, 3, 2, 2, 2, 432, 434, 5, 115, 58, 2, 433, 435, 5, 117, 59, 2, 434, 433, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 440, 3, 2, 2, 2, 436, 437, 5, 119, 60, 2, 437, 438, 5, 117, 59, 2, 438, 440, 3, 2, 2, 2, 439, 432, 3, 2, 2, 2, 439, 436, 3, 2, 2, 2, 440, 112, 3, 2, 2, 2, 441, 442, 7, 50, 2, 2, 442, 445, 9, 9, 2, 2, 443, 446, 5, 121, 61, 2, 444, 446, 5, 123, 62, 2, 445, 443, 3, 2, 2, 2, 445, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 5, 125, 63, 2, 448, 114, 3, 2, 2, 2, 449, 451, 5, 119, 60, 2, 450, 449, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 48, 2, 2, 453, 458, 5, 119, 60, 2, 454, 455, 5, 119, 60, 2, 455, 456, 7, 48, 2, 2, 456, 458, 3, 2, 2, 2, 457, 450, 3, 2, 2, 2, 457, 454, 3, 2, 2, 2, 458, 116, 3, 2, 2, 2, 459, 461, 9, 13, 2, 2, 460, 462, 9, 14, 2, 2, 461, 460, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 5, 119, 60, 2, 464, 118, 3, 2, 2, 2, 465, 467, 5, 91, 46, 2, 466, 465, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 466, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 120, 3, 2, 2, 2, 470, 472, 5, 123, 62, 2, 471, 470, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 474, 7, 48, 2, 2, 474, 479, 5, 123, 62, 2, 475, 476, 5, 123, 62, 2, 476, 477, 7, 48, 2, 2, 477, 479, 3, 2, 2, 2, 478, 471, 3, 2, 2, 2, 478, 475, 3, 2, 2, 2, 479, 122, 3, 2, 2, 2, 480, 482, 5, 105, 53, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 124, 3, 2, 2, 2, 485, 487, 9, 15, 2, 2, 486, 488, 9, 14, 2, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 3, 2, 2, 2, 489, 490, 5, 119, 60, 2, 490, 126, 3, 2, 2, 2, 491, 492, 7, 94, 2, 2, 492, 507, 9, 16, 2, 2, 493, 494, 7, 94, 2, 2, 494, 496, 5, 103, 52, 2, 495, 497, 5, 103, 52, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 499, 3, 2, 2, 2, 498, 500, 5, 103, 52, 2, 499, 498, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 507, 3, 2, 2, 2, 501, 502, 7, 94, 2, 2, 502, 503, 7, 122, 2, 2, 503, 504, 3, 2, 2, 2, 504, 507, 5, 123, 62, 2, 505, 507, 5, 109, 55, 2, 506, 491, 3, 2, 2, 2, 506, 493, 3, 2, 2, 2, 506, 501, 3, 2, 2, 2, 506, 505, 3, 2, 2, 2, 507, 128, 3, 2, 2, 2, 508, 510, 9, 17, 2, 2, 509, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 8, 65, 2, 2, 514, 130, 3, 2, 2, 2, 515, 517, 7, 15, 2, 2, 516, 518, 7, 12, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 521, 3, 2, 2, 2, 519, 521, 7, 12, 2, 2, 520, 515, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 8, 66, 2, 2, 523, 132, 3, 2, 2, 2, 49, 2, 167, 181, 213, 219, 227, 242, 244, 290, 296, 300, 305, 307, 315, 318, 322, 327, 330, 336, 342, 347, 352, 357, 366, 375, 386, 392, 396, 402, 430, 434, 439, 445, 450, 457, 461, 468, 471, 478, 483, 487, 496, 499, 506, 511, 517, 520, 3, 8, 2, 2] \ No newline at end of file diff --git a/internal/parser/planparserv2/generated/PlanLexer.tokens b/internal/parser/planparserv2/generated/PlanLexer.tokens index 267fe7d82b..d8456d3b61 100644 --- a/internal/parser/planparserv2/generated/PlanLexer.tokens +++ b/internal/parser/planparserv2/generated/PlanLexer.tokens @@ -29,14 +29,15 @@ NOT=28 IN=29 NIN=30 EmptyTerm=31 -BooleanConstant=32 -IntegerConstant=33 -FloatingConstant=34 -Identifier=35 -StringLiteral=36 -JSONIdentifier=37 -Whitespace=38 -Newline=39 +JSONContains=32 +BooleanConstant=33 +IntegerConstant=34 +FloatingConstant=35 +Identifier=36 +StringLiteral=37 +JSONIdentifier=38 +Whitespace=39 +Newline=40 '('=1 ')'=2 '['=3 @@ -62,3 +63,4 @@ Newline=39 '~'=27 'in'=29 'not in'=30 +'json_contains'=32 diff --git a/internal/parser/planparserv2/generated/plan_base_visitor.go b/internal/parser/planparserv2/generated/plan_base_visitor.go index f177e5c744..5a476d4db5 100644 --- a/internal/parser/planparserv2/generated/plan_base_visitor.go +++ b/internal/parser/planparserv2/generated/plan_base_visitor.go @@ -75,6 +75,10 @@ func (v *BasePlanVisitor) VisitTerm(ctx *TermContext) interface{} { return v.VisitChildren(ctx) } +func (v *BasePlanVisitor) VisitJSONContains(ctx *JSONContainsContext) interface{} { + return v.VisitChildren(ctx) +} + func (v *BasePlanVisitor) VisitRange(ctx *RangeContext) interface{} { return v.VisitChildren(ctx) } diff --git a/internal/parser/planparserv2/generated/plan_lexer.go b/internal/parser/planparserv2/generated/plan_lexer.go index 1fc9e35058..31ba28e641 100644 --- a/internal/parser/planparserv2/generated/plan_lexer.go +++ b/internal/parser/planparserv2/generated/plan_lexer.go @@ -14,7 +14,7 @@ var _ = fmt.Printf var _ = unicode.IsLetter var serializedLexerAtn = []uint16{ - 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 41, 508, + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 42, 524, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, @@ -27,229 +27,236 @@ var serializedLexerAtn = []uint16{ 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, - 9, 65, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, - 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, - 3, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, - 13, 3, 13, 5, 13, 166, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, - 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 180, 10, 14, 3, 15, 3, - 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, - 3, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, - 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 212, 10, 26, - 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 218, 10, 27, 3, 28, 3, 28, 3, 29, 3, - 29, 3, 29, 3, 29, 5, 29, 226, 10, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, - 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 7, 32, 241, 10, - 32, 12, 32, 14, 32, 244, 11, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, - 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, + 9, 65, 4, 66, 9, 66, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, + 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, + 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, + 13, 3, 13, 3, 13, 3, 13, 5, 13, 168, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, + 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 182, 10, + 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, + 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, + 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, + 214, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 220, 10, 27, 3, 28, 3, + 28, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 228, 10, 29, 3, 30, 3, 30, 3, 30, + 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 7, + 32, 243, 10, 32, 12, 32, 14, 32, 246, 11, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, - 33, 3, 33, 3, 33, 5, 33, 275, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, - 281, 10, 34, 3, 35, 3, 35, 5, 35, 285, 10, 35, 3, 36, 3, 36, 3, 36, 7, - 36, 290, 10, 36, 12, 36, 14, 36, 293, 11, 36, 3, 36, 3, 36, 3, 36, 3, 36, - 3, 36, 5, 36, 300, 10, 36, 3, 37, 5, 37, 303, 10, 37, 3, 37, 3, 37, 5, - 37, 307, 10, 37, 3, 37, 3, 37, 3, 37, 5, 37, 312, 10, 37, 3, 37, 5, 37, - 315, 10, 37, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 321, 10, 38, 3, 38, 3, - 38, 6, 38, 325, 10, 38, 13, 38, 14, 38, 326, 3, 39, 3, 39, 3, 39, 5, 39, - 332, 10, 39, 3, 40, 6, 40, 335, 10, 40, 13, 40, 14, 40, 336, 3, 41, 6, - 41, 340, 10, 41, 13, 41, 14, 41, 341, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, - 3, 42, 3, 42, 5, 42, 351, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, - 43, 3, 43, 5, 43, 360, 10, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, - 3, 46, 6, 46, 369, 10, 46, 13, 46, 14, 46, 370, 3, 47, 3, 47, 7, 47, 375, - 10, 47, 12, 47, 14, 47, 378, 11, 47, 3, 47, 5, 47, 381, 10, 47, 3, 48, - 3, 48, 7, 48, 385, 10, 48, 12, 48, 14, 48, 388, 11, 48, 3, 49, 3, 49, 3, - 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, - 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, - 54, 3, 54, 5, 54, 415, 10, 54, 3, 55, 3, 55, 5, 55, 419, 10, 55, 3, 55, - 3, 55, 3, 55, 5, 55, 424, 10, 55, 3, 56, 3, 56, 3, 56, 3, 56, 5, 56, 430, - 10, 56, 3, 56, 3, 56, 3, 57, 5, 57, 435, 10, 57, 3, 57, 3, 57, 3, 57, 3, - 57, 3, 57, 5, 57, 442, 10, 57, 3, 58, 3, 58, 5, 58, 446, 10, 58, 3, 58, - 3, 58, 3, 59, 6, 59, 451, 10, 59, 13, 59, 14, 59, 452, 3, 60, 5, 60, 456, - 10, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 5, 60, 463, 10, 60, 3, 61, 6, - 61, 466, 10, 61, 13, 61, 14, 61, 467, 3, 62, 3, 62, 5, 62, 472, 10, 62, - 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 5, 63, 481, 10, 63, 3, - 63, 5, 63, 484, 10, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 5, 63, 491, - 10, 63, 3, 64, 6, 64, 494, 10, 64, 13, 64, 14, 64, 495, 3, 64, 3, 64, 3, - 65, 3, 65, 5, 65, 502, 10, 65, 3, 65, 5, 65, 505, 10, 65, 3, 65, 3, 65, - 2, 2, 66, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, - 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, - 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, - 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, - 75, 39, 77, 2, 79, 2, 81, 2, 83, 2, 85, 2, 87, 2, 89, 2, 91, 2, 93, 2, - 95, 2, 97, 2, 99, 2, 101, 2, 103, 2, 105, 2, 107, 2, 109, 2, 111, 2, 113, - 2, 115, 2, 117, 2, 119, 2, 121, 2, 123, 2, 125, 2, 127, 40, 129, 41, 3, - 2, 18, 5, 2, 78, 78, 87, 87, 119, 119, 6, 2, 12, 12, 15, 15, 36, 36, 94, - 94, 6, 2, 12, 12, 15, 15, 41, 41, 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, - 3, 2, 50, 59, 4, 2, 68, 68, 100, 100, 3, 2, 50, 51, 4, 2, 90, 90, 122, - 122, 3, 2, 51, 59, 3, 2, 50, 57, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 71, - 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 82, 82, 114, 114, 12, 2, 36, - 36, 41, 41, 65, 65, 94, 94, 99, 100, 104, 104, 112, 112, 116, 116, 118, - 118, 120, 120, 4, 2, 11, 11, 34, 34, 2, 540, 2, 3, 3, 2, 2, 2, 2, 5, 3, - 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, - 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, - 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, - 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, - 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, - 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, - 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, - 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, - 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, - 2, 75, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 3, 131, 3, 2, - 2, 2, 5, 133, 3, 2, 2, 2, 7, 135, 3, 2, 2, 2, 9, 137, 3, 2, 2, 2, 11, 139, - 3, 2, 2, 2, 13, 141, 3, 2, 2, 2, 15, 143, 3, 2, 2, 2, 17, 146, 3, 2, 2, - 2, 19, 148, 3, 2, 2, 2, 21, 151, 3, 2, 2, 2, 23, 154, 3, 2, 2, 2, 25, 165, - 3, 2, 2, 2, 27, 179, 3, 2, 2, 2, 29, 181, 3, 2, 2, 2, 31, 183, 3, 2, 2, - 2, 33, 185, 3, 2, 2, 2, 35, 187, 3, 2, 2, 2, 37, 189, 3, 2, 2, 2, 39, 191, - 3, 2, 2, 2, 41, 194, 3, 2, 2, 2, 43, 197, 3, 2, 2, 2, 45, 200, 3, 2, 2, - 2, 47, 202, 3, 2, 2, 2, 49, 204, 3, 2, 2, 2, 51, 211, 3, 2, 2, 2, 53, 217, - 3, 2, 2, 2, 55, 219, 3, 2, 2, 2, 57, 225, 3, 2, 2, 2, 59, 227, 3, 2, 2, - 2, 61, 230, 3, 2, 2, 2, 63, 237, 3, 2, 2, 2, 65, 274, 3, 2, 2, 2, 67, 280, - 3, 2, 2, 2, 69, 284, 3, 2, 2, 2, 71, 299, 3, 2, 2, 2, 73, 302, 3, 2, 2, - 2, 75, 316, 3, 2, 2, 2, 77, 331, 3, 2, 2, 2, 79, 334, 3, 2, 2, 2, 81, 339, - 3, 2, 2, 2, 83, 350, 3, 2, 2, 2, 85, 359, 3, 2, 2, 2, 87, 361, 3, 2, 2, - 2, 89, 363, 3, 2, 2, 2, 91, 365, 3, 2, 2, 2, 93, 380, 3, 2, 2, 2, 95, 382, - 3, 2, 2, 2, 97, 389, 3, 2, 2, 2, 99, 393, 3, 2, 2, 2, 101, 395, 3, 2, 2, - 2, 103, 397, 3, 2, 2, 2, 105, 399, 3, 2, 2, 2, 107, 414, 3, 2, 2, 2, 109, - 423, 3, 2, 2, 2, 111, 425, 3, 2, 2, 2, 113, 441, 3, 2, 2, 2, 115, 443, - 3, 2, 2, 2, 117, 450, 3, 2, 2, 2, 119, 462, 3, 2, 2, 2, 121, 465, 3, 2, - 2, 2, 123, 469, 3, 2, 2, 2, 125, 490, 3, 2, 2, 2, 127, 493, 3, 2, 2, 2, - 129, 504, 3, 2, 2, 2, 131, 132, 7, 42, 2, 2, 132, 4, 3, 2, 2, 2, 133, 134, - 7, 43, 2, 2, 134, 6, 3, 2, 2, 2, 135, 136, 7, 93, 2, 2, 136, 8, 3, 2, 2, - 2, 137, 138, 7, 46, 2, 2, 138, 10, 3, 2, 2, 2, 139, 140, 7, 95, 2, 2, 140, - 12, 3, 2, 2, 2, 141, 142, 7, 62, 2, 2, 142, 14, 3, 2, 2, 2, 143, 144, 7, - 62, 2, 2, 144, 145, 7, 63, 2, 2, 145, 16, 3, 2, 2, 2, 146, 147, 7, 64, - 2, 2, 147, 18, 3, 2, 2, 2, 148, 149, 7, 64, 2, 2, 149, 150, 7, 63, 2, 2, - 150, 20, 3, 2, 2, 2, 151, 152, 7, 63, 2, 2, 152, 153, 7, 63, 2, 2, 153, - 22, 3, 2, 2, 2, 154, 155, 7, 35, 2, 2, 155, 156, 7, 63, 2, 2, 156, 24, - 3, 2, 2, 2, 157, 158, 7, 110, 2, 2, 158, 159, 7, 107, 2, 2, 159, 160, 7, - 109, 2, 2, 160, 166, 7, 103, 2, 2, 161, 162, 7, 78, 2, 2, 162, 163, 7, - 75, 2, 2, 163, 164, 7, 77, 2, 2, 164, 166, 7, 71, 2, 2, 165, 157, 3, 2, - 2, 2, 165, 161, 3, 2, 2, 2, 166, 26, 3, 2, 2, 2, 167, 168, 7, 103, 2, 2, - 168, 169, 7, 122, 2, 2, 169, 170, 7, 107, 2, 2, 170, 171, 7, 117, 2, 2, - 171, 172, 7, 118, 2, 2, 172, 180, 7, 117, 2, 2, 173, 174, 7, 71, 2, 2, - 174, 175, 7, 90, 2, 2, 175, 176, 7, 75, 2, 2, 176, 177, 7, 85, 2, 2, 177, - 178, 7, 86, 2, 2, 178, 180, 7, 85, 2, 2, 179, 167, 3, 2, 2, 2, 179, 173, - 3, 2, 2, 2, 180, 28, 3, 2, 2, 2, 181, 182, 7, 45, 2, 2, 182, 30, 3, 2, - 2, 2, 183, 184, 7, 47, 2, 2, 184, 32, 3, 2, 2, 2, 185, 186, 7, 44, 2, 2, - 186, 34, 3, 2, 2, 2, 187, 188, 7, 49, 2, 2, 188, 36, 3, 2, 2, 2, 189, 190, - 7, 39, 2, 2, 190, 38, 3, 2, 2, 2, 191, 192, 7, 44, 2, 2, 192, 193, 7, 44, - 2, 2, 193, 40, 3, 2, 2, 2, 194, 195, 7, 62, 2, 2, 195, 196, 7, 62, 2, 2, - 196, 42, 3, 2, 2, 2, 197, 198, 7, 64, 2, 2, 198, 199, 7, 64, 2, 2, 199, - 44, 3, 2, 2, 2, 200, 201, 7, 40, 2, 2, 201, 46, 3, 2, 2, 2, 202, 203, 7, - 126, 2, 2, 203, 48, 3, 2, 2, 2, 204, 205, 7, 96, 2, 2, 205, 50, 3, 2, 2, - 2, 206, 207, 7, 40, 2, 2, 207, 212, 7, 40, 2, 2, 208, 209, 7, 99, 2, 2, - 209, 210, 7, 112, 2, 2, 210, 212, 7, 102, 2, 2, 211, 206, 3, 2, 2, 2, 211, - 208, 3, 2, 2, 2, 212, 52, 3, 2, 2, 2, 213, 214, 7, 126, 2, 2, 214, 218, - 7, 126, 2, 2, 215, 216, 7, 113, 2, 2, 216, 218, 7, 116, 2, 2, 217, 213, - 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 218, 54, 3, 2, 2, 2, 219, 220, 7, 128, - 2, 2, 220, 56, 3, 2, 2, 2, 221, 226, 7, 35, 2, 2, 222, 223, 7, 112, 2, - 2, 223, 224, 7, 113, 2, 2, 224, 226, 7, 118, 2, 2, 225, 221, 3, 2, 2, 2, - 225, 222, 3, 2, 2, 2, 226, 58, 3, 2, 2, 2, 227, 228, 7, 107, 2, 2, 228, - 229, 7, 112, 2, 2, 229, 60, 3, 2, 2, 2, 230, 231, 7, 112, 2, 2, 231, 232, - 7, 113, 2, 2, 232, 233, 7, 118, 2, 2, 233, 234, 7, 34, 2, 2, 234, 235, - 7, 107, 2, 2, 235, 236, 7, 112, 2, 2, 236, 62, 3, 2, 2, 2, 237, 242, 7, - 93, 2, 2, 238, 241, 5, 127, 64, 2, 239, 241, 5, 129, 65, 2, 240, 238, 3, - 2, 2, 2, 240, 239, 3, 2, 2, 2, 241, 244, 3, 2, 2, 2, 242, 240, 3, 2, 2, - 2, 242, 243, 3, 2, 2, 2, 243, 245, 3, 2, 2, 2, 244, 242, 3, 2, 2, 2, 245, - 246, 7, 95, 2, 2, 246, 64, 3, 2, 2, 2, 247, 248, 7, 118, 2, 2, 248, 249, - 7, 116, 2, 2, 249, 250, 7, 119, 2, 2, 250, 275, 7, 103, 2, 2, 251, 252, - 7, 86, 2, 2, 252, 253, 7, 116, 2, 2, 253, 254, 7, 119, 2, 2, 254, 275, - 7, 103, 2, 2, 255, 256, 7, 86, 2, 2, 256, 257, 7, 84, 2, 2, 257, 258, 7, - 87, 2, 2, 258, 275, 7, 71, 2, 2, 259, 260, 7, 104, 2, 2, 260, 261, 7, 99, - 2, 2, 261, 262, 7, 110, 2, 2, 262, 263, 7, 117, 2, 2, 263, 275, 7, 103, - 2, 2, 264, 265, 7, 72, 2, 2, 265, 266, 7, 99, 2, 2, 266, 267, 7, 110, 2, - 2, 267, 268, 7, 117, 2, 2, 268, 275, 7, 103, 2, 2, 269, 270, 7, 72, 2, - 2, 270, 271, 7, 67, 2, 2, 271, 272, 7, 78, 2, 2, 272, 273, 7, 85, 2, 2, - 273, 275, 7, 71, 2, 2, 274, 247, 3, 2, 2, 2, 274, 251, 3, 2, 2, 2, 274, - 255, 3, 2, 2, 2, 274, 259, 3, 2, 2, 2, 274, 264, 3, 2, 2, 2, 274, 269, - 3, 2, 2, 2, 275, 66, 3, 2, 2, 2, 276, 281, 5, 93, 47, 2, 277, 281, 5, 95, - 48, 2, 278, 281, 5, 97, 49, 2, 279, 281, 5, 91, 46, 2, 280, 276, 3, 2, - 2, 2, 280, 277, 3, 2, 2, 2, 280, 278, 3, 2, 2, 2, 280, 279, 3, 2, 2, 2, - 281, 68, 3, 2, 2, 2, 282, 285, 5, 109, 55, 2, 283, 285, 5, 111, 56, 2, - 284, 282, 3, 2, 2, 2, 284, 283, 3, 2, 2, 2, 285, 70, 3, 2, 2, 2, 286, 291, - 5, 87, 44, 2, 287, 290, 5, 87, 44, 2, 288, 290, 5, 89, 45, 2, 289, 287, - 3, 2, 2, 2, 289, 288, 3, 2, 2, 2, 290, 293, 3, 2, 2, 2, 291, 289, 3, 2, - 2, 2, 291, 292, 3, 2, 2, 2, 292, 300, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, - 294, 295, 7, 38, 2, 2, 295, 296, 7, 111, 2, 2, 296, 297, 7, 103, 2, 2, - 297, 298, 7, 118, 2, 2, 298, 300, 7, 99, 2, 2, 299, 286, 3, 2, 2, 2, 299, - 294, 3, 2, 2, 2, 300, 72, 3, 2, 2, 2, 301, 303, 5, 77, 39, 2, 302, 301, - 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 303, 314, 3, 2, 2, 2, 304, 306, 7, 36, - 2, 2, 305, 307, 5, 79, 40, 2, 306, 305, 3, 2, 2, 2, 306, 307, 3, 2, 2, - 2, 307, 308, 3, 2, 2, 2, 308, 315, 7, 36, 2, 2, 309, 311, 7, 41, 2, 2, - 310, 312, 5, 81, 41, 2, 311, 310, 3, 2, 2, 2, 311, 312, 3, 2, 2, 2, 312, - 313, 3, 2, 2, 2, 313, 315, 7, 41, 2, 2, 314, 304, 3, 2, 2, 2, 314, 309, - 3, 2, 2, 2, 315, 74, 3, 2, 2, 2, 316, 324, 5, 71, 36, 2, 317, 320, 7, 93, - 2, 2, 318, 321, 5, 73, 37, 2, 319, 321, 5, 93, 47, 2, 320, 318, 3, 2, 2, - 2, 320, 319, 3, 2, 2, 2, 321, 322, 3, 2, 2, 2, 322, 323, 7, 95, 2, 2, 323, - 325, 3, 2, 2, 2, 324, 317, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 324, - 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 76, 3, 2, 2, 2, 328, 329, 7, 119, - 2, 2, 329, 332, 7, 58, 2, 2, 330, 332, 9, 2, 2, 2, 331, 328, 3, 2, 2, 2, - 331, 330, 3, 2, 2, 2, 332, 78, 3, 2, 2, 2, 333, 335, 5, 83, 42, 2, 334, - 333, 3, 2, 2, 2, 335, 336, 3, 2, 2, 2, 336, 334, 3, 2, 2, 2, 336, 337, - 3, 2, 2, 2, 337, 80, 3, 2, 2, 2, 338, 340, 5, 85, 43, 2, 339, 338, 3, 2, - 2, 2, 340, 341, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 341, 342, 3, 2, 2, 2, - 342, 82, 3, 2, 2, 2, 343, 351, 10, 3, 2, 2, 344, 351, 5, 125, 63, 2, 345, - 346, 7, 94, 2, 2, 346, 351, 7, 12, 2, 2, 347, 348, 7, 94, 2, 2, 348, 349, - 7, 15, 2, 2, 349, 351, 7, 12, 2, 2, 350, 343, 3, 2, 2, 2, 350, 344, 3, - 2, 2, 2, 350, 345, 3, 2, 2, 2, 350, 347, 3, 2, 2, 2, 351, 84, 3, 2, 2, - 2, 352, 360, 10, 4, 2, 2, 353, 360, 5, 125, 63, 2, 354, 355, 7, 94, 2, - 2, 355, 360, 7, 12, 2, 2, 356, 357, 7, 94, 2, 2, 357, 358, 7, 15, 2, 2, - 358, 360, 7, 12, 2, 2, 359, 352, 3, 2, 2, 2, 359, 353, 3, 2, 2, 2, 359, - 354, 3, 2, 2, 2, 359, 356, 3, 2, 2, 2, 360, 86, 3, 2, 2, 2, 361, 362, 9, - 5, 2, 2, 362, 88, 3, 2, 2, 2, 363, 364, 9, 6, 2, 2, 364, 90, 3, 2, 2, 2, - 365, 366, 7, 50, 2, 2, 366, 368, 9, 7, 2, 2, 367, 369, 9, 8, 2, 2, 368, - 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 368, 3, 2, 2, 2, 370, 371, - 3, 2, 2, 2, 371, 92, 3, 2, 2, 2, 372, 376, 5, 99, 50, 2, 373, 375, 5, 89, - 45, 2, 374, 373, 3, 2, 2, 2, 375, 378, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, - 376, 377, 3, 2, 2, 2, 377, 381, 3, 2, 2, 2, 378, 376, 3, 2, 2, 2, 379, - 381, 7, 50, 2, 2, 380, 372, 3, 2, 2, 2, 380, 379, 3, 2, 2, 2, 381, 94, - 3, 2, 2, 2, 382, 386, 7, 50, 2, 2, 383, 385, 5, 101, 51, 2, 384, 383, 3, - 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, - 2, 387, 96, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 390, 7, 50, 2, 2, 390, - 391, 9, 9, 2, 2, 391, 392, 5, 121, 61, 2, 392, 98, 3, 2, 2, 2, 393, 394, - 9, 10, 2, 2, 394, 100, 3, 2, 2, 2, 395, 396, 9, 11, 2, 2, 396, 102, 3, - 2, 2, 2, 397, 398, 9, 12, 2, 2, 398, 104, 3, 2, 2, 2, 399, 400, 5, 103, - 52, 2, 400, 401, 5, 103, 52, 2, 401, 402, 5, 103, 52, 2, 402, 403, 5, 103, - 52, 2, 403, 106, 3, 2, 2, 2, 404, 405, 7, 94, 2, 2, 405, 406, 7, 119, 2, - 2, 406, 407, 3, 2, 2, 2, 407, 415, 5, 105, 53, 2, 408, 409, 7, 94, 2, 2, - 409, 410, 7, 87, 2, 2, 410, 411, 3, 2, 2, 2, 411, 412, 5, 105, 53, 2, 412, - 413, 5, 105, 53, 2, 413, 415, 3, 2, 2, 2, 414, 404, 3, 2, 2, 2, 414, 408, - 3, 2, 2, 2, 415, 108, 3, 2, 2, 2, 416, 418, 5, 113, 57, 2, 417, 419, 5, - 115, 58, 2, 418, 417, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 424, 3, 2, - 2, 2, 420, 421, 5, 117, 59, 2, 421, 422, 5, 115, 58, 2, 422, 424, 3, 2, - 2, 2, 423, 416, 3, 2, 2, 2, 423, 420, 3, 2, 2, 2, 424, 110, 3, 2, 2, 2, - 425, 426, 7, 50, 2, 2, 426, 429, 9, 9, 2, 2, 427, 430, 5, 119, 60, 2, 428, - 430, 5, 121, 61, 2, 429, 427, 3, 2, 2, 2, 429, 428, 3, 2, 2, 2, 430, 431, - 3, 2, 2, 2, 431, 432, 5, 123, 62, 2, 432, 112, 3, 2, 2, 2, 433, 435, 5, - 117, 59, 2, 434, 433, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 3, 2, - 2, 2, 436, 437, 7, 48, 2, 2, 437, 442, 5, 117, 59, 2, 438, 439, 5, 117, - 59, 2, 439, 440, 7, 48, 2, 2, 440, 442, 3, 2, 2, 2, 441, 434, 3, 2, 2, - 2, 441, 438, 3, 2, 2, 2, 442, 114, 3, 2, 2, 2, 443, 445, 9, 13, 2, 2, 444, - 446, 9, 14, 2, 2, 445, 444, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 447, - 3, 2, 2, 2, 447, 448, 5, 117, 59, 2, 448, 116, 3, 2, 2, 2, 449, 451, 5, - 89, 45, 2, 450, 449, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 450, 3, 2, - 2, 2, 452, 453, 3, 2, 2, 2, 453, 118, 3, 2, 2, 2, 454, 456, 5, 121, 61, - 2, 455, 454, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, - 458, 7, 48, 2, 2, 458, 463, 5, 121, 61, 2, 459, 460, 5, 121, 61, 2, 460, - 461, 7, 48, 2, 2, 461, 463, 3, 2, 2, 2, 462, 455, 3, 2, 2, 2, 462, 459, - 3, 2, 2, 2, 463, 120, 3, 2, 2, 2, 464, 466, 5, 103, 52, 2, 465, 464, 3, - 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 467, 468, 3, 2, 2, - 2, 468, 122, 3, 2, 2, 2, 469, 471, 9, 15, 2, 2, 470, 472, 9, 14, 2, 2, - 471, 470, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, - 474, 5, 117, 59, 2, 474, 124, 3, 2, 2, 2, 475, 476, 7, 94, 2, 2, 476, 491, - 9, 16, 2, 2, 477, 478, 7, 94, 2, 2, 478, 480, 5, 101, 51, 2, 479, 481, - 5, 101, 51, 2, 480, 479, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 483, 3, - 2, 2, 2, 482, 484, 5, 101, 51, 2, 483, 482, 3, 2, 2, 2, 483, 484, 3, 2, - 2, 2, 484, 491, 3, 2, 2, 2, 485, 486, 7, 94, 2, 2, 486, 487, 7, 122, 2, - 2, 487, 488, 3, 2, 2, 2, 488, 491, 5, 121, 61, 2, 489, 491, 5, 107, 54, - 2, 490, 475, 3, 2, 2, 2, 490, 477, 3, 2, 2, 2, 490, 485, 3, 2, 2, 2, 490, - 489, 3, 2, 2, 2, 491, 126, 3, 2, 2, 2, 492, 494, 9, 17, 2, 2, 493, 492, - 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, - 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 8, 64, 2, 2, 498, 128, 3, 2, 2, 2, - 499, 501, 7, 15, 2, 2, 500, 502, 7, 12, 2, 2, 501, 500, 3, 2, 2, 2, 501, - 502, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 505, 7, 12, 2, 2, 504, 499, - 3, 2, 2, 2, 504, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 8, 65, - 2, 2, 507, 130, 3, 2, 2, 2, 49, 2, 165, 179, 211, 217, 225, 240, 242, 274, - 280, 284, 289, 291, 299, 302, 306, 311, 314, 320, 326, 331, 336, 341, 350, - 359, 370, 376, 380, 386, 414, 418, 423, 429, 434, 441, 445, 452, 455, 462, - 467, 471, 480, 483, 490, 495, 501, 504, 3, 8, 2, 2, + 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, + 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, + 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 291, 10, 34, + 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 297, 10, 35, 3, 36, 3, 36, 5, 36, 301, + 10, 36, 3, 37, 3, 37, 3, 37, 7, 37, 306, 10, 37, 12, 37, 14, 37, 309, 11, + 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 316, 10, 37, 3, 38, 5, 38, + 319, 10, 38, 3, 38, 3, 38, 5, 38, 323, 10, 38, 3, 38, 3, 38, 3, 38, 5, + 38, 328, 10, 38, 3, 38, 5, 38, 331, 10, 38, 3, 39, 3, 39, 3, 39, 3, 39, + 5, 39, 337, 10, 39, 3, 39, 3, 39, 6, 39, 341, 10, 39, 13, 39, 14, 39, 342, + 3, 40, 3, 40, 3, 40, 5, 40, 348, 10, 40, 3, 41, 6, 41, 351, 10, 41, 13, + 41, 14, 41, 352, 3, 42, 6, 42, 356, 10, 42, 13, 42, 14, 42, 357, 3, 43, + 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 367, 10, 43, 3, 44, 3, + 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 376, 10, 44, 3, 45, 3, 45, + 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 6, 47, 385, 10, 47, 13, 47, 14, 47, + 386, 3, 48, 3, 48, 7, 48, 391, 10, 48, 12, 48, 14, 48, 394, 11, 48, 3, + 48, 5, 48, 397, 10, 48, 3, 49, 3, 49, 7, 49, 401, 10, 49, 12, 49, 14, 49, + 404, 11, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, + 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, + 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 5, 55, 431, 10, 55, 3, 56, 3, + 56, 5, 56, 435, 10, 56, 3, 56, 3, 56, 3, 56, 5, 56, 440, 10, 56, 3, 57, + 3, 57, 3, 57, 3, 57, 5, 57, 446, 10, 57, 3, 57, 3, 57, 3, 58, 5, 58, 451, + 10, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 5, 58, 458, 10, 58, 3, 59, 3, + 59, 5, 59, 462, 10, 59, 3, 59, 3, 59, 3, 60, 6, 60, 467, 10, 60, 13, 60, + 14, 60, 468, 3, 61, 5, 61, 472, 10, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, + 61, 5, 61, 479, 10, 61, 3, 62, 6, 62, 482, 10, 62, 13, 62, 14, 62, 483, + 3, 63, 3, 63, 5, 63, 488, 10, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, + 64, 3, 64, 5, 64, 497, 10, 64, 3, 64, 5, 64, 500, 10, 64, 3, 64, 3, 64, + 3, 64, 3, 64, 3, 64, 5, 64, 507, 10, 64, 3, 65, 6, 65, 510, 10, 65, 13, + 65, 14, 65, 511, 3, 65, 3, 65, 3, 66, 3, 66, 5, 66, 518, 10, 66, 3, 66, + 5, 66, 521, 10, 66, 3, 66, 3, 66, 2, 2, 67, 3, 3, 5, 4, 7, 5, 9, 6, 11, + 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, + 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, + 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, + 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 2, 81, 2, 83, 2, 85, + 2, 87, 2, 89, 2, 91, 2, 93, 2, 95, 2, 97, 2, 99, 2, 101, 2, 103, 2, 105, + 2, 107, 2, 109, 2, 111, 2, 113, 2, 115, 2, 117, 2, 119, 2, 121, 2, 123, + 2, 125, 2, 127, 2, 129, 41, 131, 42, 3, 2, 18, 5, 2, 78, 78, 87, 87, 119, + 119, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 6, 2, 12, 12, 15, 15, 41, 41, + 94, 94, 5, 2, 67, 92, 97, 97, 99, 124, 3, 2, 50, 59, 4, 2, 68, 68, 100, + 100, 3, 2, 50, 51, 4, 2, 90, 90, 122, 122, 3, 2, 51, 59, 3, 2, 50, 57, + 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, + 47, 4, 2, 82, 82, 114, 114, 12, 2, 36, 36, 41, 41, 65, 65, 94, 94, 99, + 100, 104, 104, 112, 112, 116, 116, 118, 118, 120, 120, 4, 2, 11, 11, 34, + 34, 2, 556, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, + 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, + 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, + 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, + 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, + 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, + 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, + 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, + 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, + 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, + 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 3, 133, 3, 2, 2, 2, 5, 135, + 3, 2, 2, 2, 7, 137, 3, 2, 2, 2, 9, 139, 3, 2, 2, 2, 11, 141, 3, 2, 2, 2, + 13, 143, 3, 2, 2, 2, 15, 145, 3, 2, 2, 2, 17, 148, 3, 2, 2, 2, 19, 150, + 3, 2, 2, 2, 21, 153, 3, 2, 2, 2, 23, 156, 3, 2, 2, 2, 25, 167, 3, 2, 2, + 2, 27, 181, 3, 2, 2, 2, 29, 183, 3, 2, 2, 2, 31, 185, 3, 2, 2, 2, 33, 187, + 3, 2, 2, 2, 35, 189, 3, 2, 2, 2, 37, 191, 3, 2, 2, 2, 39, 193, 3, 2, 2, + 2, 41, 196, 3, 2, 2, 2, 43, 199, 3, 2, 2, 2, 45, 202, 3, 2, 2, 2, 47, 204, + 3, 2, 2, 2, 49, 206, 3, 2, 2, 2, 51, 213, 3, 2, 2, 2, 53, 219, 3, 2, 2, + 2, 55, 221, 3, 2, 2, 2, 57, 227, 3, 2, 2, 2, 59, 229, 3, 2, 2, 2, 61, 232, + 3, 2, 2, 2, 63, 239, 3, 2, 2, 2, 65, 249, 3, 2, 2, 2, 67, 290, 3, 2, 2, + 2, 69, 296, 3, 2, 2, 2, 71, 300, 3, 2, 2, 2, 73, 315, 3, 2, 2, 2, 75, 318, + 3, 2, 2, 2, 77, 332, 3, 2, 2, 2, 79, 347, 3, 2, 2, 2, 81, 350, 3, 2, 2, + 2, 83, 355, 3, 2, 2, 2, 85, 366, 3, 2, 2, 2, 87, 375, 3, 2, 2, 2, 89, 377, + 3, 2, 2, 2, 91, 379, 3, 2, 2, 2, 93, 381, 3, 2, 2, 2, 95, 396, 3, 2, 2, + 2, 97, 398, 3, 2, 2, 2, 99, 405, 3, 2, 2, 2, 101, 409, 3, 2, 2, 2, 103, + 411, 3, 2, 2, 2, 105, 413, 3, 2, 2, 2, 107, 415, 3, 2, 2, 2, 109, 430, + 3, 2, 2, 2, 111, 439, 3, 2, 2, 2, 113, 441, 3, 2, 2, 2, 115, 457, 3, 2, + 2, 2, 117, 459, 3, 2, 2, 2, 119, 466, 3, 2, 2, 2, 121, 478, 3, 2, 2, 2, + 123, 481, 3, 2, 2, 2, 125, 485, 3, 2, 2, 2, 127, 506, 3, 2, 2, 2, 129, + 509, 3, 2, 2, 2, 131, 520, 3, 2, 2, 2, 133, 134, 7, 42, 2, 2, 134, 4, 3, + 2, 2, 2, 135, 136, 7, 43, 2, 2, 136, 6, 3, 2, 2, 2, 137, 138, 7, 93, 2, + 2, 138, 8, 3, 2, 2, 2, 139, 140, 7, 46, 2, 2, 140, 10, 3, 2, 2, 2, 141, + 142, 7, 95, 2, 2, 142, 12, 3, 2, 2, 2, 143, 144, 7, 62, 2, 2, 144, 14, + 3, 2, 2, 2, 145, 146, 7, 62, 2, 2, 146, 147, 7, 63, 2, 2, 147, 16, 3, 2, + 2, 2, 148, 149, 7, 64, 2, 2, 149, 18, 3, 2, 2, 2, 150, 151, 7, 64, 2, 2, + 151, 152, 7, 63, 2, 2, 152, 20, 3, 2, 2, 2, 153, 154, 7, 63, 2, 2, 154, + 155, 7, 63, 2, 2, 155, 22, 3, 2, 2, 2, 156, 157, 7, 35, 2, 2, 157, 158, + 7, 63, 2, 2, 158, 24, 3, 2, 2, 2, 159, 160, 7, 110, 2, 2, 160, 161, 7, + 107, 2, 2, 161, 162, 7, 109, 2, 2, 162, 168, 7, 103, 2, 2, 163, 164, 7, + 78, 2, 2, 164, 165, 7, 75, 2, 2, 165, 166, 7, 77, 2, 2, 166, 168, 7, 71, + 2, 2, 167, 159, 3, 2, 2, 2, 167, 163, 3, 2, 2, 2, 168, 26, 3, 2, 2, 2, + 169, 170, 7, 103, 2, 2, 170, 171, 7, 122, 2, 2, 171, 172, 7, 107, 2, 2, + 172, 173, 7, 117, 2, 2, 173, 174, 7, 118, 2, 2, 174, 182, 7, 117, 2, 2, + 175, 176, 7, 71, 2, 2, 176, 177, 7, 90, 2, 2, 177, 178, 7, 75, 2, 2, 178, + 179, 7, 85, 2, 2, 179, 180, 7, 86, 2, 2, 180, 182, 7, 85, 2, 2, 181, 169, + 3, 2, 2, 2, 181, 175, 3, 2, 2, 2, 182, 28, 3, 2, 2, 2, 183, 184, 7, 45, + 2, 2, 184, 30, 3, 2, 2, 2, 185, 186, 7, 47, 2, 2, 186, 32, 3, 2, 2, 2, + 187, 188, 7, 44, 2, 2, 188, 34, 3, 2, 2, 2, 189, 190, 7, 49, 2, 2, 190, + 36, 3, 2, 2, 2, 191, 192, 7, 39, 2, 2, 192, 38, 3, 2, 2, 2, 193, 194, 7, + 44, 2, 2, 194, 195, 7, 44, 2, 2, 195, 40, 3, 2, 2, 2, 196, 197, 7, 62, + 2, 2, 197, 198, 7, 62, 2, 2, 198, 42, 3, 2, 2, 2, 199, 200, 7, 64, 2, 2, + 200, 201, 7, 64, 2, 2, 201, 44, 3, 2, 2, 2, 202, 203, 7, 40, 2, 2, 203, + 46, 3, 2, 2, 2, 204, 205, 7, 126, 2, 2, 205, 48, 3, 2, 2, 2, 206, 207, + 7, 96, 2, 2, 207, 50, 3, 2, 2, 2, 208, 209, 7, 40, 2, 2, 209, 214, 7, 40, + 2, 2, 210, 211, 7, 99, 2, 2, 211, 212, 7, 112, 2, 2, 212, 214, 7, 102, + 2, 2, 213, 208, 3, 2, 2, 2, 213, 210, 3, 2, 2, 2, 214, 52, 3, 2, 2, 2, + 215, 216, 7, 126, 2, 2, 216, 220, 7, 126, 2, 2, 217, 218, 7, 113, 2, 2, + 218, 220, 7, 116, 2, 2, 219, 215, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 220, + 54, 3, 2, 2, 2, 221, 222, 7, 128, 2, 2, 222, 56, 3, 2, 2, 2, 223, 228, + 7, 35, 2, 2, 224, 225, 7, 112, 2, 2, 225, 226, 7, 113, 2, 2, 226, 228, + 7, 118, 2, 2, 227, 223, 3, 2, 2, 2, 227, 224, 3, 2, 2, 2, 228, 58, 3, 2, + 2, 2, 229, 230, 7, 107, 2, 2, 230, 231, 7, 112, 2, 2, 231, 60, 3, 2, 2, + 2, 232, 233, 7, 112, 2, 2, 233, 234, 7, 113, 2, 2, 234, 235, 7, 118, 2, + 2, 235, 236, 7, 34, 2, 2, 236, 237, 7, 107, 2, 2, 237, 238, 7, 112, 2, + 2, 238, 62, 3, 2, 2, 2, 239, 244, 7, 93, 2, 2, 240, 243, 5, 129, 65, 2, + 241, 243, 5, 131, 66, 2, 242, 240, 3, 2, 2, 2, 242, 241, 3, 2, 2, 2, 243, + 246, 3, 2, 2, 2, 244, 242, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 247, + 3, 2, 2, 2, 246, 244, 3, 2, 2, 2, 247, 248, 7, 95, 2, 2, 248, 64, 3, 2, + 2, 2, 249, 250, 7, 108, 2, 2, 250, 251, 7, 117, 2, 2, 251, 252, 7, 113, + 2, 2, 252, 253, 7, 112, 2, 2, 253, 254, 7, 97, 2, 2, 254, 255, 7, 101, + 2, 2, 255, 256, 7, 113, 2, 2, 256, 257, 7, 112, 2, 2, 257, 258, 7, 118, + 2, 2, 258, 259, 7, 99, 2, 2, 259, 260, 7, 107, 2, 2, 260, 261, 7, 112, + 2, 2, 261, 262, 7, 117, 2, 2, 262, 66, 3, 2, 2, 2, 263, 264, 7, 118, 2, + 2, 264, 265, 7, 116, 2, 2, 265, 266, 7, 119, 2, 2, 266, 291, 7, 103, 2, + 2, 267, 268, 7, 86, 2, 2, 268, 269, 7, 116, 2, 2, 269, 270, 7, 119, 2, + 2, 270, 291, 7, 103, 2, 2, 271, 272, 7, 86, 2, 2, 272, 273, 7, 84, 2, 2, + 273, 274, 7, 87, 2, 2, 274, 291, 7, 71, 2, 2, 275, 276, 7, 104, 2, 2, 276, + 277, 7, 99, 2, 2, 277, 278, 7, 110, 2, 2, 278, 279, 7, 117, 2, 2, 279, + 291, 7, 103, 2, 2, 280, 281, 7, 72, 2, 2, 281, 282, 7, 99, 2, 2, 282, 283, + 7, 110, 2, 2, 283, 284, 7, 117, 2, 2, 284, 291, 7, 103, 2, 2, 285, 286, + 7, 72, 2, 2, 286, 287, 7, 67, 2, 2, 287, 288, 7, 78, 2, 2, 288, 289, 7, + 85, 2, 2, 289, 291, 7, 71, 2, 2, 290, 263, 3, 2, 2, 2, 290, 267, 3, 2, + 2, 2, 290, 271, 3, 2, 2, 2, 290, 275, 3, 2, 2, 2, 290, 280, 3, 2, 2, 2, + 290, 285, 3, 2, 2, 2, 291, 68, 3, 2, 2, 2, 292, 297, 5, 95, 48, 2, 293, + 297, 5, 97, 49, 2, 294, 297, 5, 99, 50, 2, 295, 297, 5, 93, 47, 2, 296, + 292, 3, 2, 2, 2, 296, 293, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 296, 295, + 3, 2, 2, 2, 297, 70, 3, 2, 2, 2, 298, 301, 5, 111, 56, 2, 299, 301, 5, + 113, 57, 2, 300, 298, 3, 2, 2, 2, 300, 299, 3, 2, 2, 2, 301, 72, 3, 2, + 2, 2, 302, 307, 5, 89, 45, 2, 303, 306, 5, 89, 45, 2, 304, 306, 5, 91, + 46, 2, 305, 303, 3, 2, 2, 2, 305, 304, 3, 2, 2, 2, 306, 309, 3, 2, 2, 2, + 307, 305, 3, 2, 2, 2, 307, 308, 3, 2, 2, 2, 308, 316, 3, 2, 2, 2, 309, + 307, 3, 2, 2, 2, 310, 311, 7, 38, 2, 2, 311, 312, 7, 111, 2, 2, 312, 313, + 7, 103, 2, 2, 313, 314, 7, 118, 2, 2, 314, 316, 7, 99, 2, 2, 315, 302, + 3, 2, 2, 2, 315, 310, 3, 2, 2, 2, 316, 74, 3, 2, 2, 2, 317, 319, 5, 79, + 40, 2, 318, 317, 3, 2, 2, 2, 318, 319, 3, 2, 2, 2, 319, 330, 3, 2, 2, 2, + 320, 322, 7, 36, 2, 2, 321, 323, 5, 81, 41, 2, 322, 321, 3, 2, 2, 2, 322, + 323, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 331, 7, 36, 2, 2, 325, 327, + 7, 41, 2, 2, 326, 328, 5, 83, 42, 2, 327, 326, 3, 2, 2, 2, 327, 328, 3, + 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 7, 41, 2, 2, 330, 320, 3, 2, 2, + 2, 330, 325, 3, 2, 2, 2, 331, 76, 3, 2, 2, 2, 332, 340, 5, 73, 37, 2, 333, + 336, 7, 93, 2, 2, 334, 337, 5, 75, 38, 2, 335, 337, 5, 95, 48, 2, 336, + 334, 3, 2, 2, 2, 336, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 339, + 7, 95, 2, 2, 339, 341, 3, 2, 2, 2, 340, 333, 3, 2, 2, 2, 341, 342, 3, 2, + 2, 2, 342, 340, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 78, 3, 2, 2, 2, + 344, 345, 7, 119, 2, 2, 345, 348, 7, 58, 2, 2, 346, 348, 9, 2, 2, 2, 347, + 344, 3, 2, 2, 2, 347, 346, 3, 2, 2, 2, 348, 80, 3, 2, 2, 2, 349, 351, 5, + 85, 43, 2, 350, 349, 3, 2, 2, 2, 351, 352, 3, 2, 2, 2, 352, 350, 3, 2, + 2, 2, 352, 353, 3, 2, 2, 2, 353, 82, 3, 2, 2, 2, 354, 356, 5, 87, 44, 2, + 355, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 355, 3, 2, 2, 2, 357, + 358, 3, 2, 2, 2, 358, 84, 3, 2, 2, 2, 359, 367, 10, 3, 2, 2, 360, 367, + 5, 127, 64, 2, 361, 362, 7, 94, 2, 2, 362, 367, 7, 12, 2, 2, 363, 364, + 7, 94, 2, 2, 364, 365, 7, 15, 2, 2, 365, 367, 7, 12, 2, 2, 366, 359, 3, + 2, 2, 2, 366, 360, 3, 2, 2, 2, 366, 361, 3, 2, 2, 2, 366, 363, 3, 2, 2, + 2, 367, 86, 3, 2, 2, 2, 368, 376, 10, 4, 2, 2, 369, 376, 5, 127, 64, 2, + 370, 371, 7, 94, 2, 2, 371, 376, 7, 12, 2, 2, 372, 373, 7, 94, 2, 2, 373, + 374, 7, 15, 2, 2, 374, 376, 7, 12, 2, 2, 375, 368, 3, 2, 2, 2, 375, 369, + 3, 2, 2, 2, 375, 370, 3, 2, 2, 2, 375, 372, 3, 2, 2, 2, 376, 88, 3, 2, + 2, 2, 377, 378, 9, 5, 2, 2, 378, 90, 3, 2, 2, 2, 379, 380, 9, 6, 2, 2, + 380, 92, 3, 2, 2, 2, 381, 382, 7, 50, 2, 2, 382, 384, 9, 7, 2, 2, 383, + 385, 9, 8, 2, 2, 384, 383, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 384, + 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 94, 3, 2, 2, 2, 388, 392, 5, 101, + 51, 2, 389, 391, 5, 91, 46, 2, 390, 389, 3, 2, 2, 2, 391, 394, 3, 2, 2, + 2, 392, 390, 3, 2, 2, 2, 392, 393, 3, 2, 2, 2, 393, 397, 3, 2, 2, 2, 394, + 392, 3, 2, 2, 2, 395, 397, 7, 50, 2, 2, 396, 388, 3, 2, 2, 2, 396, 395, + 3, 2, 2, 2, 397, 96, 3, 2, 2, 2, 398, 402, 7, 50, 2, 2, 399, 401, 5, 103, + 52, 2, 400, 399, 3, 2, 2, 2, 401, 404, 3, 2, 2, 2, 402, 400, 3, 2, 2, 2, + 402, 403, 3, 2, 2, 2, 403, 98, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 405, 406, + 7, 50, 2, 2, 406, 407, 9, 9, 2, 2, 407, 408, 5, 123, 62, 2, 408, 100, 3, + 2, 2, 2, 409, 410, 9, 10, 2, 2, 410, 102, 3, 2, 2, 2, 411, 412, 9, 11, + 2, 2, 412, 104, 3, 2, 2, 2, 413, 414, 9, 12, 2, 2, 414, 106, 3, 2, 2, 2, + 415, 416, 5, 105, 53, 2, 416, 417, 5, 105, 53, 2, 417, 418, 5, 105, 53, + 2, 418, 419, 5, 105, 53, 2, 419, 108, 3, 2, 2, 2, 420, 421, 7, 94, 2, 2, + 421, 422, 7, 119, 2, 2, 422, 423, 3, 2, 2, 2, 423, 431, 5, 107, 54, 2, + 424, 425, 7, 94, 2, 2, 425, 426, 7, 87, 2, 2, 426, 427, 3, 2, 2, 2, 427, + 428, 5, 107, 54, 2, 428, 429, 5, 107, 54, 2, 429, 431, 3, 2, 2, 2, 430, + 420, 3, 2, 2, 2, 430, 424, 3, 2, 2, 2, 431, 110, 3, 2, 2, 2, 432, 434, + 5, 115, 58, 2, 433, 435, 5, 117, 59, 2, 434, 433, 3, 2, 2, 2, 434, 435, + 3, 2, 2, 2, 435, 440, 3, 2, 2, 2, 436, 437, 5, 119, 60, 2, 437, 438, 5, + 117, 59, 2, 438, 440, 3, 2, 2, 2, 439, 432, 3, 2, 2, 2, 439, 436, 3, 2, + 2, 2, 440, 112, 3, 2, 2, 2, 441, 442, 7, 50, 2, 2, 442, 445, 9, 9, 2, 2, + 443, 446, 5, 121, 61, 2, 444, 446, 5, 123, 62, 2, 445, 443, 3, 2, 2, 2, + 445, 444, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 448, 5, 125, 63, 2, 448, + 114, 3, 2, 2, 2, 449, 451, 5, 119, 60, 2, 450, 449, 3, 2, 2, 2, 450, 451, + 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 452, 453, 7, 48, 2, 2, 453, 458, 5, 119, + 60, 2, 454, 455, 5, 119, 60, 2, 455, 456, 7, 48, 2, 2, 456, 458, 3, 2, + 2, 2, 457, 450, 3, 2, 2, 2, 457, 454, 3, 2, 2, 2, 458, 116, 3, 2, 2, 2, + 459, 461, 9, 13, 2, 2, 460, 462, 9, 14, 2, 2, 461, 460, 3, 2, 2, 2, 461, + 462, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 464, 5, 119, 60, 2, 464, 118, + 3, 2, 2, 2, 465, 467, 5, 91, 46, 2, 466, 465, 3, 2, 2, 2, 467, 468, 3, + 2, 2, 2, 468, 466, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 120, 3, 2, 2, + 2, 470, 472, 5, 123, 62, 2, 471, 470, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, + 472, 473, 3, 2, 2, 2, 473, 474, 7, 48, 2, 2, 474, 479, 5, 123, 62, 2, 475, + 476, 5, 123, 62, 2, 476, 477, 7, 48, 2, 2, 477, 479, 3, 2, 2, 2, 478, 471, + 3, 2, 2, 2, 478, 475, 3, 2, 2, 2, 479, 122, 3, 2, 2, 2, 480, 482, 5, 105, + 53, 2, 481, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, + 483, 484, 3, 2, 2, 2, 484, 124, 3, 2, 2, 2, 485, 487, 9, 15, 2, 2, 486, + 488, 9, 14, 2, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, + 3, 2, 2, 2, 489, 490, 5, 119, 60, 2, 490, 126, 3, 2, 2, 2, 491, 492, 7, + 94, 2, 2, 492, 507, 9, 16, 2, 2, 493, 494, 7, 94, 2, 2, 494, 496, 5, 103, + 52, 2, 495, 497, 5, 103, 52, 2, 496, 495, 3, 2, 2, 2, 496, 497, 3, 2, 2, + 2, 497, 499, 3, 2, 2, 2, 498, 500, 5, 103, 52, 2, 499, 498, 3, 2, 2, 2, + 499, 500, 3, 2, 2, 2, 500, 507, 3, 2, 2, 2, 501, 502, 7, 94, 2, 2, 502, + 503, 7, 122, 2, 2, 503, 504, 3, 2, 2, 2, 504, 507, 5, 123, 62, 2, 505, + 507, 5, 109, 55, 2, 506, 491, 3, 2, 2, 2, 506, 493, 3, 2, 2, 2, 506, 501, + 3, 2, 2, 2, 506, 505, 3, 2, 2, 2, 507, 128, 3, 2, 2, 2, 508, 510, 9, 17, + 2, 2, 509, 508, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 509, 3, 2, 2, 2, + 511, 512, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 8, 65, 2, 2, 514, + 130, 3, 2, 2, 2, 515, 517, 7, 15, 2, 2, 516, 518, 7, 12, 2, 2, 517, 516, + 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 521, 3, 2, 2, 2, 519, 521, 7, 12, + 2, 2, 520, 515, 3, 2, 2, 2, 520, 519, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, + 522, 523, 8, 66, 2, 2, 523, 132, 3, 2, 2, 2, 49, 2, 167, 181, 213, 219, + 227, 242, 244, 290, 296, 300, 305, 307, 315, 318, 322, 327, 330, 336, 342, + 347, 352, 357, 366, 375, 386, 392, 396, 402, 430, 434, 439, 445, 450, 457, + 461, 468, 471, 478, 483, 487, 496, 499, 506, 511, 517, 520, 3, 8, 2, 2, } var lexerChannelNames = []string{ @@ -263,23 +270,23 @@ var lexerModeNames = []string{ var lexerLiteralNames = []string{ "", "'('", "')'", "'['", "','", "']'", "'<'", "'<='", "'>'", "'>='", "'=='", "'!='", "", "", "'+'", "'-'", "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", - "'&'", "'|'", "'^'", "", "", "'~'", "", "'in'", "'not in'", + "'&'", "'|'", "'^'", "", "", "'~'", "", "'in'", "'not in'", "", "'json_contains'", } var lexerSymbolicNames = []string{ "", "", "", "", "", "", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", - "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", "BooleanConstant", - "IntegerConstant", "FloatingConstant", "Identifier", "StringLiteral", "JSONIdentifier", - "Whitespace", "Newline", + "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", "JSONContains", + "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", + "StringLiteral", "JSONIdentifier", "Whitespace", "Newline", } var lexerRuleNames = []string{ "T__0", "T__1", "T__2", "T__3", "T__4", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", - "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", - "StringLiteral", "JSONIdentifier", "EncodingPrefix", "DoubleSCharSequence", + "JSONContains", "BooleanConstant", "IntegerConstant", "FloatingConstant", + "Identifier", "StringLiteral", "JSONIdentifier", "EncodingPrefix", "DoubleSCharSequence", "SingleSCharSequence", "DoubleSChar", "SingleSChar", "Nondigit", "Digit", "BinaryConstant", "DecimalConstant", "OctalConstant", "HexadecimalConstant", "NonzeroDigit", "OctalDigit", "HexadecimalDigit", "HexQuad", "UniversalCharacterName", @@ -356,12 +363,13 @@ const ( PlanLexerIN = 29 PlanLexerNIN = 30 PlanLexerEmptyTerm = 31 - PlanLexerBooleanConstant = 32 - PlanLexerIntegerConstant = 33 - PlanLexerFloatingConstant = 34 - PlanLexerIdentifier = 35 - PlanLexerStringLiteral = 36 - PlanLexerJSONIdentifier = 37 - PlanLexerWhitespace = 38 - PlanLexerNewline = 39 + PlanLexerJSONContains = 32 + PlanLexerBooleanConstant = 33 + PlanLexerIntegerConstant = 34 + PlanLexerFloatingConstant = 35 + PlanLexerIdentifier = 36 + PlanLexerStringLiteral = 37 + PlanLexerJSONIdentifier = 38 + PlanLexerWhitespace = 39 + PlanLexerNewline = 40 ) diff --git a/internal/parser/planparserv2/generated/plan_parser.go b/internal/parser/planparserv2/generated/plan_parser.go index 601231f145..9c009ec551 100644 --- a/internal/parser/planparserv2/generated/plan_parser.go +++ b/internal/parser/planparserv2/generated/plan_parser.go @@ -15,62 +15,65 @@ var _ = reflect.Copy var _ = strconv.Itoa var parserATN = []uint16{ - 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 41, 92, 4, + 3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 42, 99, 4, 2, 9, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, - 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 20, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, + 2, 27, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, - 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, - 2, 74, 10, 2, 12, 2, 14, 2, 77, 11, 2, 3, 2, 5, 2, 80, 10, 2, 3, 2, 3, - 2, 3, 2, 3, 2, 3, 2, 7, 2, 87, 10, 2, 12, 2, 14, 2, 90, 11, 2, 3, 2, 2, - 3, 2, 3, 2, 2, 12, 4, 2, 16, 17, 29, 30, 3, 2, 18, 20, 3, 2, 16, 17, 3, - 2, 22, 23, 3, 2, 8, 9, 4, 2, 37, 37, 39, 39, 3, 2, 10, 11, 3, 2, 8, 11, - 3, 2, 12, 13, 3, 2, 31, 32, 2, 116, 2, 19, 3, 2, 2, 2, 4, 5, 8, 2, 1, 2, - 5, 20, 7, 35, 2, 2, 6, 20, 7, 36, 2, 2, 7, 20, 7, 34, 2, 2, 8, 20, 7, 38, - 2, 2, 9, 20, 7, 37, 2, 2, 10, 20, 7, 39, 2, 2, 11, 12, 7, 3, 2, 2, 12, - 13, 5, 2, 2, 2, 13, 14, 7, 4, 2, 2, 14, 20, 3, 2, 2, 2, 15, 16, 9, 2, 2, - 2, 16, 20, 5, 2, 2, 18, 17, 18, 7, 15, 2, 2, 18, 20, 5, 2, 2, 3, 19, 4, - 3, 2, 2, 2, 19, 6, 3, 2, 2, 2, 19, 7, 3, 2, 2, 2, 19, 8, 3, 2, 2, 2, 19, - 9, 3, 2, 2, 2, 19, 10, 3, 2, 2, 2, 19, 11, 3, 2, 2, 2, 19, 15, 3, 2, 2, - 2, 19, 17, 3, 2, 2, 2, 20, 88, 3, 2, 2, 2, 21, 22, 12, 19, 2, 2, 22, 23, - 7, 21, 2, 2, 23, 87, 5, 2, 2, 20, 24, 25, 12, 17, 2, 2, 25, 26, 9, 3, 2, - 2, 26, 87, 5, 2, 2, 18, 27, 28, 12, 16, 2, 2, 28, 29, 9, 4, 2, 2, 29, 87, - 5, 2, 2, 17, 30, 31, 12, 15, 2, 2, 31, 32, 9, 5, 2, 2, 32, 87, 5, 2, 2, - 16, 33, 34, 12, 12, 2, 2, 34, 35, 9, 6, 2, 2, 35, 36, 9, 7, 2, 2, 36, 37, - 9, 6, 2, 2, 37, 87, 5, 2, 2, 13, 38, 39, 12, 11, 2, 2, 39, 40, 9, 8, 2, - 2, 40, 41, 9, 7, 2, 2, 41, 42, 9, 8, 2, 2, 42, 87, 5, 2, 2, 12, 43, 44, - 12, 10, 2, 2, 44, 45, 9, 9, 2, 2, 45, 87, 5, 2, 2, 11, 46, 47, 12, 9, 2, - 2, 47, 48, 9, 10, 2, 2, 48, 87, 5, 2, 2, 10, 49, 50, 12, 8, 2, 2, 50, 51, - 7, 24, 2, 2, 51, 87, 5, 2, 2, 9, 52, 53, 12, 7, 2, 2, 53, 54, 7, 26, 2, - 2, 54, 87, 5, 2, 2, 8, 55, 56, 12, 6, 2, 2, 56, 57, 7, 25, 2, 2, 57, 87, - 5, 2, 2, 7, 58, 59, 12, 5, 2, 2, 59, 60, 7, 27, 2, 2, 60, 87, 5, 2, 2, - 6, 61, 62, 12, 4, 2, 2, 62, 63, 7, 28, 2, 2, 63, 87, 5, 2, 2, 5, 64, 65, - 12, 20, 2, 2, 65, 66, 7, 14, 2, 2, 66, 87, 7, 38, 2, 2, 67, 68, 12, 14, - 2, 2, 68, 69, 9, 11, 2, 2, 69, 70, 7, 5, 2, 2, 70, 75, 5, 2, 2, 2, 71, - 72, 7, 6, 2, 2, 72, 74, 5, 2, 2, 2, 73, 71, 3, 2, 2, 2, 74, 77, 3, 2, 2, - 2, 75, 73, 3, 2, 2, 2, 75, 76, 3, 2, 2, 2, 76, 79, 3, 2, 2, 2, 77, 75, - 3, 2, 2, 2, 78, 80, 7, 6, 2, 2, 79, 78, 3, 2, 2, 2, 79, 80, 3, 2, 2, 2, - 80, 81, 3, 2, 2, 2, 81, 82, 7, 7, 2, 2, 82, 87, 3, 2, 2, 2, 83, 84, 12, - 13, 2, 2, 84, 85, 9, 11, 2, 2, 85, 87, 7, 33, 2, 2, 86, 21, 3, 2, 2, 2, - 86, 24, 3, 2, 2, 2, 86, 27, 3, 2, 2, 2, 86, 30, 3, 2, 2, 2, 86, 33, 3, - 2, 2, 2, 86, 38, 3, 2, 2, 2, 86, 43, 3, 2, 2, 2, 86, 46, 3, 2, 2, 2, 86, - 49, 3, 2, 2, 2, 86, 52, 3, 2, 2, 2, 86, 55, 3, 2, 2, 2, 86, 58, 3, 2, 2, - 2, 86, 61, 3, 2, 2, 2, 86, 64, 3, 2, 2, 2, 86, 67, 3, 2, 2, 2, 86, 83, - 3, 2, 2, 2, 87, 90, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, - 89, 3, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 7, 19, 75, 79, 86, 88, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, 2, 81, 10, 2, 12, 2, 14, 2, 84, + 11, 2, 3, 2, 5, 2, 87, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, 2, 94, 10, + 2, 12, 2, 14, 2, 97, 11, 2, 3, 2, 2, 3, 2, 3, 2, 2, 12, 4, 2, 16, 17, 29, + 30, 3, 2, 18, 20, 3, 2, 16, 17, 3, 2, 22, 23, 3, 2, 8, 9, 4, 2, 38, 38, + 40, 40, 3, 2, 10, 11, 3, 2, 8, 11, 3, 2, 12, 13, 3, 2, 31, 32, 2, 124, + 2, 26, 3, 2, 2, 2, 4, 5, 8, 2, 1, 2, 5, 27, 7, 36, 2, 2, 6, 27, 7, 37, + 2, 2, 7, 27, 7, 35, 2, 2, 8, 27, 7, 39, 2, 2, 9, 27, 7, 38, 2, 2, 10, 27, + 7, 40, 2, 2, 11, 12, 7, 3, 2, 2, 12, 13, 5, 2, 2, 2, 13, 14, 7, 4, 2, 2, + 14, 27, 3, 2, 2, 2, 15, 16, 9, 2, 2, 2, 16, 27, 5, 2, 2, 19, 17, 18, 7, + 34, 2, 2, 18, 19, 7, 3, 2, 2, 19, 20, 5, 2, 2, 2, 20, 21, 7, 6, 2, 2, 21, + 22, 5, 2, 2, 2, 22, 23, 7, 4, 2, 2, 23, 27, 3, 2, 2, 2, 24, 25, 7, 15, + 2, 2, 25, 27, 5, 2, 2, 3, 26, 4, 3, 2, 2, 2, 26, 6, 3, 2, 2, 2, 26, 7, + 3, 2, 2, 2, 26, 8, 3, 2, 2, 2, 26, 9, 3, 2, 2, 2, 26, 10, 3, 2, 2, 2, 26, + 11, 3, 2, 2, 2, 26, 15, 3, 2, 2, 2, 26, 17, 3, 2, 2, 2, 26, 24, 3, 2, 2, + 2, 27, 95, 3, 2, 2, 2, 28, 29, 12, 20, 2, 2, 29, 30, 7, 21, 2, 2, 30, 94, + 5, 2, 2, 21, 31, 32, 12, 18, 2, 2, 32, 33, 9, 3, 2, 2, 33, 94, 5, 2, 2, + 19, 34, 35, 12, 17, 2, 2, 35, 36, 9, 4, 2, 2, 36, 94, 5, 2, 2, 18, 37, + 38, 12, 16, 2, 2, 38, 39, 9, 5, 2, 2, 39, 94, 5, 2, 2, 17, 40, 41, 12, + 12, 2, 2, 41, 42, 9, 6, 2, 2, 42, 43, 9, 7, 2, 2, 43, 44, 9, 6, 2, 2, 44, + 94, 5, 2, 2, 13, 45, 46, 12, 11, 2, 2, 46, 47, 9, 8, 2, 2, 47, 48, 9, 7, + 2, 2, 48, 49, 9, 8, 2, 2, 49, 94, 5, 2, 2, 12, 50, 51, 12, 10, 2, 2, 51, + 52, 9, 9, 2, 2, 52, 94, 5, 2, 2, 11, 53, 54, 12, 9, 2, 2, 54, 55, 9, 10, + 2, 2, 55, 94, 5, 2, 2, 10, 56, 57, 12, 8, 2, 2, 57, 58, 7, 24, 2, 2, 58, + 94, 5, 2, 2, 9, 59, 60, 12, 7, 2, 2, 60, 61, 7, 26, 2, 2, 61, 94, 5, 2, + 2, 8, 62, 63, 12, 6, 2, 2, 63, 64, 7, 25, 2, 2, 64, 94, 5, 2, 2, 7, 65, + 66, 12, 5, 2, 2, 66, 67, 7, 27, 2, 2, 67, 94, 5, 2, 2, 6, 68, 69, 12, 4, + 2, 2, 69, 70, 7, 28, 2, 2, 70, 94, 5, 2, 2, 5, 71, 72, 12, 21, 2, 2, 72, + 73, 7, 14, 2, 2, 73, 94, 7, 39, 2, 2, 74, 75, 12, 15, 2, 2, 75, 76, 9, + 11, 2, 2, 76, 77, 7, 5, 2, 2, 77, 82, 5, 2, 2, 2, 78, 79, 7, 6, 2, 2, 79, + 81, 5, 2, 2, 2, 80, 78, 3, 2, 2, 2, 81, 84, 3, 2, 2, 2, 82, 80, 3, 2, 2, + 2, 82, 83, 3, 2, 2, 2, 83, 86, 3, 2, 2, 2, 84, 82, 3, 2, 2, 2, 85, 87, + 7, 6, 2, 2, 86, 85, 3, 2, 2, 2, 86, 87, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, + 88, 89, 7, 7, 2, 2, 89, 94, 3, 2, 2, 2, 90, 91, 12, 14, 2, 2, 91, 92, 9, + 11, 2, 2, 92, 94, 7, 33, 2, 2, 93, 28, 3, 2, 2, 2, 93, 31, 3, 2, 2, 2, + 93, 34, 3, 2, 2, 2, 93, 37, 3, 2, 2, 2, 93, 40, 3, 2, 2, 2, 93, 45, 3, + 2, 2, 2, 93, 50, 3, 2, 2, 2, 93, 53, 3, 2, 2, 2, 93, 56, 3, 2, 2, 2, 93, + 59, 3, 2, 2, 2, 93, 62, 3, 2, 2, 2, 93, 65, 3, 2, 2, 2, 93, 68, 3, 2, 2, + 2, 93, 71, 3, 2, 2, 2, 93, 74, 3, 2, 2, 2, 93, 90, 3, 2, 2, 2, 94, 97, + 3, 2, 2, 2, 95, 93, 3, 2, 2, 2, 95, 96, 3, 2, 2, 2, 96, 3, 3, 2, 2, 2, + 97, 95, 3, 2, 2, 2, 7, 26, 82, 86, 93, 95, } var literalNames = []string{ "", "'('", "')'", "'['", "','", "']'", "'<'", "'<='", "'>'", "'>='", "'=='", "'!='", "", "", "'+'", "'-'", "'*'", "'/'", "'%'", "'**'", "'<<'", "'>>'", - "'&'", "'|'", "'^'", "", "", "'~'", "", "'in'", "'not in'", + "'&'", "'|'", "'^'", "", "", "'~'", "", "'in'", "'not in'", "", "'json_contains'", } var symbolicNames = []string{ "", "", "", "", "", "", "LT", "LE", "GT", "GE", "EQ", "NE", "LIKE", "EXISTS", "ADD", "SUB", "MUL", "DIV", "MOD", "POW", "SHL", "SHR", "BAND", "BOR", - "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", "BooleanConstant", - "IntegerConstant", "FloatingConstant", "Identifier", "StringLiteral", "JSONIdentifier", - "Whitespace", "Newline", + "BXOR", "AND", "OR", "BNOT", "NOT", "IN", "NIN", "EmptyTerm", "JSONContains", + "BooleanConstant", "IntegerConstant", "FloatingConstant", "Identifier", + "StringLiteral", "JSONIdentifier", "Whitespace", "Newline", } var ruleNames = []string{ @@ -140,14 +143,15 @@ const ( PlanParserIN = 29 PlanParserNIN = 30 PlanParserEmptyTerm = 31 - PlanParserBooleanConstant = 32 - PlanParserIntegerConstant = 33 - PlanParserFloatingConstant = 34 - PlanParserIdentifier = 35 - PlanParserStringLiteral = 36 - PlanParserJSONIdentifier = 37 - PlanParserWhitespace = 38 - PlanParserNewline = 39 + PlanParserJSONContains = 32 + PlanParserBooleanConstant = 33 + PlanParserIntegerConstant = 34 + PlanParserFloatingConstant = 35 + PlanParserIdentifier = 36 + PlanParserStringLiteral = 37 + PlanParserJSONIdentifier = 38 + PlanParserWhitespace = 39 + PlanParserNewline = 40 ) // PlanParserRULE_expr is the PlanParser rule. @@ -1093,6 +1097,61 @@ func (s *TermContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { } } +type JSONContainsContext struct { + *ExprContext +} + +func NewJSONContainsContext(parser antlr.Parser, ctx antlr.ParserRuleContext) *JSONContainsContext { + var p = new(JSONContainsContext) + + p.ExprContext = NewEmptyExprContext() + p.parser = parser + p.CopyFrom(ctx.(*ExprContext)) + + return p +} + +func (s *JSONContainsContext) GetRuleContext() antlr.RuleContext { + return s +} + +func (s *JSONContainsContext) JSONContains() antlr.TerminalNode { + return s.GetToken(PlanParserJSONContains, 0) +} + +func (s *JSONContainsContext) AllExpr() []IExprContext { + var ts = s.GetTypedRuleContexts(reflect.TypeOf((*IExprContext)(nil)).Elem()) + var tst = make([]IExprContext, len(ts)) + + for i, t := range ts { + if t != nil { + tst[i] = t.(IExprContext) + } + } + + return tst +} + +func (s *JSONContainsContext) Expr(i int) IExprContext { + var t = s.GetTypedRuleContext(reflect.TypeOf((*IExprContext)(nil)).Elem(), i) + + if t == nil { + return nil + } + + return t.(IExprContext) +} + +func (s *JSONContainsContext) Accept(visitor antlr.ParseTreeVisitor) interface{} { + switch t := visitor.(type) { + case PlanVisitor: + return t.VisitJSONContains(s) + + default: + return t.VisitChildren(s) + } +} + type RangeContext struct { *ExprContext op1 antlr.Token @@ -1564,7 +1623,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { var _alt int p.EnterOuterAlt(localctx, 1) - p.SetState(17) + p.SetState(24) p.GetErrorHandler().Sync(p) switch p.GetTokenStream().LA(1) { @@ -1664,7 +1723,36 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } { p.SetState(14) - p.expr(16) + p.expr(17) + } + + case PlanParserJSONContains: + localctx = NewJSONContainsContext(p, localctx) + p.SetParserRuleContext(localctx) + _prevctx = localctx + { + p.SetState(15) + p.Match(PlanParserJSONContains) + } + { + p.SetState(16) + p.Match(PlanParserT__0) + } + { + p.SetState(17) + p.expr(0) + } + { + p.SetState(18) + p.Match(PlanParserT__3) + } + { + p.SetState(19) + p.expr(0) + } + { + p.SetState(20) + p.Match(PlanParserT__1) } case PlanParserEXISTS: @@ -1672,11 +1760,11 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.SetParserRuleContext(localctx) _prevctx = localctx { - p.SetState(15) + p.SetState(22) p.Match(PlanParserEXISTS) } { - p.SetState(16) + p.SetState(23) p.expr(1) } @@ -1684,7 +1772,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { panic(antlr.NewNoViableAltException(p, nil, nil, nil, nil, nil)) } p.GetParserRuleContext().SetStop(p.GetTokenStream().LT(-1)) - p.SetState(86) + p.SetState(93) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 4, p.GetParserRuleContext()) @@ -1694,36 +1782,36 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { p.TriggerExitRuleEvent() } _prevctx = localctx - p.SetState(84) + p.SetState(91) p.GetErrorHandler().Sync(p) switch p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 3, p.GetParserRuleContext()) { case 1: localctx = NewPowerContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(19) + p.SetState(26) - if !(p.Precpred(p.GetParserRuleContext(), 17)) { - panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 17)", "")) + if !(p.Precpred(p.GetParserRuleContext(), 18)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 18)", "")) } { - p.SetState(20) + p.SetState(27) p.Match(PlanParserPOW) } { - p.SetState(21) - p.expr(18) + p.SetState(28) + p.expr(19) } case 2: localctx = NewMulDivModContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(22) + p.SetState(29) - if !(p.Precpred(p.GetParserRuleContext(), 15)) { - panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 15)", "")) + if !(p.Precpred(p.GetParserRuleContext(), 16)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 16)", "")) } { - p.SetState(23) + p.SetState(30) var _lt = p.GetTokenStream().LT(1) @@ -1741,20 +1829,20 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(24) - p.expr(16) + p.SetState(31) + p.expr(17) } case 3: localctx = NewAddSubContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(25) + p.SetState(32) - if !(p.Precpred(p.GetParserRuleContext(), 14)) { - panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 14)", "")) + if !(p.Precpred(p.GetParserRuleContext(), 15)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 15)", "")) } { - p.SetState(26) + p.SetState(33) var _lt = p.GetTokenStream().LT(1) @@ -1772,20 +1860,20 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(27) - p.expr(15) + p.SetState(34) + p.expr(16) } case 4: localctx = NewShiftContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(28) + p.SetState(35) - if !(p.Precpred(p.GetParserRuleContext(), 13)) { - panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 13)", "")) + if !(p.Precpred(p.GetParserRuleContext(), 14)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 14)", "")) } { - p.SetState(29) + p.SetState(36) var _lt = p.GetTokenStream().LT(1) @@ -1803,20 +1891,20 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(30) - p.expr(14) + p.SetState(37) + p.expr(15) } case 5: localctx = NewRangeContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(31) + p.SetState(38) if !(p.Precpred(p.GetParserRuleContext(), 10)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 10)", "")) } { - p.SetState(32) + p.SetState(39) var _lt = p.GetTokenStream().LT(1) @@ -1834,7 +1922,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(33) + p.SetState(40) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserJSONIdentifier) { @@ -1845,7 +1933,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(34) + p.SetState(41) var _lt = p.GetTokenStream().LT(1) @@ -1863,20 +1951,20 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(35) + p.SetState(42) p.expr(11) } case 6: localctx = NewReverseRangeContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(36) + p.SetState(43) if !(p.Precpred(p.GetParserRuleContext(), 9)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 9)", "")) } { - p.SetState(37) + p.SetState(44) var _lt = p.GetTokenStream().LT(1) @@ -1894,7 +1982,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(38) + p.SetState(45) _la = p.GetTokenStream().LA(1) if !(_la == PlanParserIdentifier || _la == PlanParserJSONIdentifier) { @@ -1905,7 +1993,7 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(39) + p.SetState(46) var _lt = p.GetTokenStream().LT(1) @@ -1923,20 +2011,20 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(40) + p.SetState(47) p.expr(10) } case 7: localctx = NewRelationalContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(41) + p.SetState(48) if !(p.Precpred(p.GetParserRuleContext(), 8)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 8)", "")) } { - p.SetState(42) + p.SetState(49) var _lt = p.GetTokenStream().LT(1) @@ -1954,20 +2042,20 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(43) + p.SetState(50) p.expr(9) } case 8: localctx = NewEqualityContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(44) + p.SetState(51) if !(p.Precpred(p.GetParserRuleContext(), 7)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 7)", "")) } { - p.SetState(45) + p.SetState(52) var _lt = p.GetTokenStream().LT(1) @@ -1985,122 +2073,122 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(46) + p.SetState(53) p.expr(8) } case 9: localctx = NewBitAndContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(47) + p.SetState(54) if !(p.Precpred(p.GetParserRuleContext(), 6)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 6)", "")) } { - p.SetState(48) + p.SetState(55) p.Match(PlanParserBAND) } { - p.SetState(49) + p.SetState(56) p.expr(7) } case 10: localctx = NewBitXorContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(50) + p.SetState(57) if !(p.Precpred(p.GetParserRuleContext(), 5)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 5)", "")) } { - p.SetState(51) + p.SetState(58) p.Match(PlanParserBXOR) } { - p.SetState(52) + p.SetState(59) p.expr(6) } case 11: localctx = NewBitOrContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(53) + p.SetState(60) if !(p.Precpred(p.GetParserRuleContext(), 4)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 4)", "")) } { - p.SetState(54) + p.SetState(61) p.Match(PlanParserBOR) } { - p.SetState(55) + p.SetState(62) p.expr(5) } case 12: localctx = NewLogicalAndContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(56) + p.SetState(63) if !(p.Precpred(p.GetParserRuleContext(), 3)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 3)", "")) } { - p.SetState(57) + p.SetState(64) p.Match(PlanParserAND) } { - p.SetState(58) + p.SetState(65) p.expr(4) } case 13: localctx = NewLogicalOrContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(59) + p.SetState(66) if !(p.Precpred(p.GetParserRuleContext(), 2)) { panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 2)", "")) } { - p.SetState(60) + p.SetState(67) p.Match(PlanParserOR) } { - p.SetState(61) + p.SetState(68) p.expr(3) } case 14: localctx = NewLikeContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(62) + p.SetState(69) - if !(p.Precpred(p.GetParserRuleContext(), 18)) { - panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 18)", "")) + if !(p.Precpred(p.GetParserRuleContext(), 19)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 19)", "")) } { - p.SetState(63) + p.SetState(70) p.Match(PlanParserLIKE) } { - p.SetState(64) + p.SetState(71) p.Match(PlanParserStringLiteral) } case 15: localctx = NewTermContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(65) + p.SetState(72) - if !(p.Precpred(p.GetParserRuleContext(), 12)) { - panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 12)", "")) + if !(p.Precpred(p.GetParserRuleContext(), 13)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 13)", "")) } { - p.SetState(66) + p.SetState(73) var _lt = p.GetTokenStream().LT(1) @@ -2119,59 +2207,59 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } { - p.SetState(67) + p.SetState(74) p.Match(PlanParserT__2) } { - p.SetState(68) + p.SetState(75) p.expr(0) } - p.SetState(73) + p.SetState(80) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 1, p.GetParserRuleContext()) for _alt != 2 && _alt != antlr.ATNInvalidAltNumber { if _alt == 1 { { - p.SetState(69) + p.SetState(76) p.Match(PlanParserT__3) } { - p.SetState(70) + p.SetState(77) p.expr(0) } } - p.SetState(75) + p.SetState(82) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 1, p.GetParserRuleContext()) } - p.SetState(77) + p.SetState(84) p.GetErrorHandler().Sync(p) _la = p.GetTokenStream().LA(1) if _la == PlanParserT__3 { { - p.SetState(76) + p.SetState(83) p.Match(PlanParserT__3) } } { - p.SetState(79) + p.SetState(86) p.Match(PlanParserT__4) } case 16: localctx = NewEmptyTermContext(p, NewExprContext(p, _parentctx, _parentState)) p.PushNewRecursionContext(localctx, _startState, PlanParserRULE_expr) - p.SetState(81) + p.SetState(88) - if !(p.Precpred(p.GetParserRuleContext(), 11)) { - panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 11)", "")) + if !(p.Precpred(p.GetParserRuleContext(), 12)) { + panic(antlr.NewFailedPredicateException(p, "p.Precpred(p.GetParserRuleContext(), 12)", "")) } { - p.SetState(82) + p.SetState(89) var _lt = p.GetTokenStream().LT(1) @@ -2189,14 +2277,14 @@ func (p *PlanParser) expr(_p int) (localctx IExprContext) { } } { - p.SetState(83) + p.SetState(90) p.Match(PlanParserEmptyTerm) } } } - p.SetState(88) + p.SetState(95) p.GetErrorHandler().Sync(p) _alt = p.GetInterpreter().AdaptivePredict(p.GetTokenStream(), 4, p.GetParserRuleContext()) } @@ -2221,16 +2309,16 @@ func (p *PlanParser) Sempred(localctx antlr.RuleContext, ruleIndex, predIndex in func (p *PlanParser) Expr_Sempred(localctx antlr.RuleContext, predIndex int) bool { switch predIndex { case 0: - return p.Precpred(p.GetParserRuleContext(), 17) + return p.Precpred(p.GetParserRuleContext(), 18) case 1: - return p.Precpred(p.GetParserRuleContext(), 15) + return p.Precpred(p.GetParserRuleContext(), 16) case 2: - return p.Precpred(p.GetParserRuleContext(), 14) + return p.Precpred(p.GetParserRuleContext(), 15) case 3: - return p.Precpred(p.GetParserRuleContext(), 13) + return p.Precpred(p.GetParserRuleContext(), 14) case 4: return p.Precpred(p.GetParserRuleContext(), 10) @@ -2260,13 +2348,13 @@ func (p *PlanParser) Expr_Sempred(localctx antlr.RuleContext, predIndex int) boo return p.Precpred(p.GetParserRuleContext(), 2) case 13: - return p.Precpred(p.GetParserRuleContext(), 18) + return p.Precpred(p.GetParserRuleContext(), 19) case 14: - return p.Precpred(p.GetParserRuleContext(), 12) + return p.Precpred(p.GetParserRuleContext(), 13) case 15: - return p.Precpred(p.GetParserRuleContext(), 11) + return p.Precpred(p.GetParserRuleContext(), 12) default: panic("No predicate with index: " + fmt.Sprint(predIndex)) diff --git a/internal/parser/planparserv2/generated/plan_visitor.go b/internal/parser/planparserv2/generated/plan_visitor.go index a8d8d4f89e..f448646e61 100644 --- a/internal/parser/planparserv2/generated/plan_visitor.go +++ b/internal/parser/planparserv2/generated/plan_visitor.go @@ -58,6 +58,9 @@ type PlanVisitor interface { // Visit a parse tree produced by PlanParser#Term. VisitTerm(ctx *TermContext) interface{} + // Visit a parse tree produced by PlanParser#JSONContains. + VisitJSONContains(ctx *JSONContainsContext) interface{} + // Visit a parse tree produced by PlanParser#Range. VisitRange(ctx *RangeContext) interface{} diff --git a/internal/parser/planparserv2/parser_visitor.go b/internal/parser/planparserv2/parser_visitor.go index 70e8123ba6..b52323447c 100644 --- a/internal/parser/planparserv2/parser_visitor.go +++ b/internal/parser/planparserv2/parser_visitor.go @@ -1023,3 +1023,42 @@ func (v *ParserVisitor) VisitExists(ctx *parser.ExistsContext) interface{} { dataType: schemapb.DataType_Bool, } } + +func (v *ParserVisitor) VisitJSONContains(ctx *parser.JSONContainsContext) interface{} { + field := ctx.Expr(0).Accept(v) + if err := getError(field); err != nil { + return err + } + + columnInfo := toColumnInfo(field.(*ExprWithType)) + if columnInfo == nil || !typeutil.IsJSONType(columnInfo.GetDataType()) { + return fmt.Errorf( + "json_contains operation are only supported on json fields now, got: %s", ctx.Expr(0).GetText()) + } + + element := ctx.Expr(1).Accept(v) + if err := getError(element); err != nil { + return err + } + elementValue := getGenericValue(element) + if elementValue == nil { + return fmt.Errorf( + "json_contains operation are only supported explicitly specified element, got: %s", ctx.Expr(1).GetText()) + } + + values := make([]*planpb.GenericValue, 1) + values[0] = elementValue + expr := &planpb.Expr{ + Expr: &planpb.Expr_TermExpr{ + TermExpr: &planpb.TermExpr{ + ColumnInfo: columnInfo, + Values: values, + IsInField: true, + }, + }, + } + return &ExprWithType{ + expr: expr, + dataType: schemapb.DataType_Bool, + } +} diff --git a/internal/parser/planparserv2/plan_parser_v2.go b/internal/parser/planparserv2/plan_parser_v2.go index 65d298b1e9..416fd83b21 100644 --- a/internal/parser/planparserv2/plan_parser_v2.go +++ b/internal/parser/planparserv2/plan_parser_v2.go @@ -117,10 +117,12 @@ func CreateSearchPlan(schemaPb *schemapb.CollectionSchema, exprStr string, vecto expr, err := ParseExpr(schema, exprStr) if err != nil { + log.Info("CreateSearchPlan failed", zap.Error(err)) return nil, err } vectorField, err := schema.GetFieldFromName(vectorFieldName) if err != nil { + log.Info("CreateSearchPlan failed", zap.Error(err)) return nil, err } fieldID := vectorField.FieldID diff --git a/internal/parser/planparserv2/plan_parser_v2_test.go b/internal/parser/planparserv2/plan_parser_v2_test.go index 3c3c2b1463..119df0465e 100644 --- a/internal/parser/planparserv2/plan_parser_v2_test.go +++ b/internal/parser/planparserv2/plan_parser_v2_test.go @@ -436,6 +436,7 @@ func TestExpr_Invalid(t *testing.T) { `VarCharField in [4.0]`, `Int32Field in [4.0]`, `FloatField in [5, 6.0, true]`, + `1 in A`, // ----------------------- range ------------------------- //`1 < not_in_schema < 2`, // maybe in json `1 < 3 < 2`, @@ -1174,6 +1175,42 @@ func Test_InvalidExprWithMultipleJSONField(t *testing.T) { RoundDecimal: 0, }) assert.Error(t, err) + + expr = `A in [1, 2, 3]` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `A not in [1, 2, 3]` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `"1" in A` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `"1" not in A` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) } func Test_exprWithSingleQuotes(t *testing.T) { @@ -1234,3 +1271,248 @@ func Test_exprWithSingleQuotes(t *testing.T) { }) assert.Error(t, err) } + +func Test_JSONContains(t *testing.T) { + schema := newTestSchema() + expr := "" + var err error + expr = `json_contains(A, 10)` + plan, err := CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetTermExpr()) + + expr = `not json_contains(A, 10)` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetUnaryExpr()) + + expr = `json_contains(A, 10.5)` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetTermExpr()) + + expr = `not json_contains(A, 10.5)` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetUnaryExpr()) + + expr = `json_contains(A, "10")` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetTermExpr()) + + expr = `not json_contains(A, "10")` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetUnaryExpr()) + + expr = `json_contains($meta["A"], 10)` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetTermExpr()) + + expr = `not json_contains($meta["A"], 10)` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetUnaryExpr()) + + expr = `json_contains(JSONField["x"], 5)` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetTermExpr()) + + expr = `not json_contains(JSONField["x"], 5)` + plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + assert.NotNil(t, plan.GetVectorAnns().GetPredicates().GetUnaryExpr()) +} + +func Test_InvalidJSONContains(t *testing.T) { + schema := newTestSchema() + expr := "" + var err error + expr = `json_contains(10, A)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(1, [1,2,3])` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains([1,2,3], 1)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains([1,2,3], [1,2,3])` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains([1,2,3], [1,2])` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(A, [1,2,3])` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains($meta, 1)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(A, B)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `not json_contains(A, B)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(A, B > 5)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(StringField, "a")` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(A, StringField > 5)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(A)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(A, 5, C)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) + + expr = `json_contains(JSONField, 5)` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.Error(t, err) +}