Browse Source

Change `RENAME`'s syntax from using `=` to `AS` (ESQL-1462)

This changes the `RENAME` syntax from `RENAME new = old` to `RENAME old
AS new`.

Fixes ESQL-1447.
Bogdan Pintea 2 years ago
parent
commit
fa8b34cb88
21 changed files with 573 additions and 558 deletions
  1. 1 1
      docs/reference/esql/processing-commands/rename.asciidoc
  2. 1 1
      x-pack/plugin/esql/qa/server/single-node/src/yamlRestTest/resources/rest-api-spec/test/30_types.yml
  3. 2 2
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/docs.csv-spec
  4. 1 1
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/ip.csv-spec
  5. 18 18
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/rename.csv-spec
  6. 3 3
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/stats.csv-spec
  7. 1 1
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/version.csv-spec
  8. 8 8
      x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/EsqlActionIT.java
  9. 1 0
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4
  10. 14 12
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens
  11. 1 1
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4
  12. 14 12
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens
  13. 4 4
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java
  14. 3 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp
  15. 440 436
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java
  16. 2 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp
  17. 18 17
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java
  18. 13 13
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java
  19. 7 7
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java
  20. 17 17
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java
  21. 4 4
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/ExpressionTests.java

+ 1 - 1
docs/reference/esql/processing-commands/rename.asciidoc

@@ -5,7 +5,7 @@ Use `RENAME` to rename a column using the following syntax:
 
 [source,esql]
 ----
-RENAME <new-name> = <old-name>
+RENAME <old-name> AS <new-name>
 ----
 
 For example:

+ 1 - 1
x-pack/plugin/esql/qa/server/single-node/src/yamlRestTest/resources/rest-api-spec/test/30_types.yml

@@ -334,7 +334,7 @@ ip:
   - do:
       esql.query:
         body:
-          query: 'from test | where keyword == "127.0.0.2" | rename IP = ip | drop keyword'
+          query: 'from test | where keyword == "127.0.0.2" | rename ip as IP | drop keyword'
 
   - match: {columns.0.name: IP }
   - match: {columns.0.type: ip }

+ 2 - 2
x-pack/plugin/esql/qa/testFixtures/src/main/resources/docs.csv-spec

@@ -108,7 +108,7 @@ docsRename
 // tag::rename[]
 FROM employees
 | KEEP first_name, last_name, still_hired
-| RENAME employed = still_hired
+| RENAME  still_hired AS employed
 // end::rename[]
 | LIMIT 0;
 
@@ -119,7 +119,7 @@ docsRenameMultipleColumns
 // tag::renameMultipleColumns[]
 FROM employees
 | KEEP first_name, last_name
-| RENAME fn = first_name, ln = last_name
+| RENAME first_name AS fn, last_name AS ln
 // end::renameMultipleColumns[]
 | LIMIT 0;
 

+ 1 - 1
x-pack/plugin/esql/qa/testFixtures/src/main/resources/ip.csv-spec

@@ -75,7 +75,7 @@ lo0            |gamma          |fe80::cae2:65ff:fece:feb9|fe81::cae2:65ff:fece:f
 ;
 
 aggAndSort
-from hosts | stats c=count(ip0) by ip0 | sort ip0 | rename ip=ip0;
+from hosts | stats c=count(ip0) by ip0 | sort ip0 | rename ip0 as ip;
 
 c:long         |ip:ip
 1              |::1

+ 18 - 18
x-pack/plugin/esql/qa/testFixtures/src/main/resources/rename.csv-spec

@@ -1,82 +1,82 @@
 renameFirstCol
-row a = 1, b = 2 | rename c = a;
+row a = 1, b = 2 | rename a as c;
 
 c:integer | b:integer
 1 | 2
 ;
 
 renameSecondCol
-row a = 1, b = 2 | rename c = b;
+row a = 1, b = 2 | rename b as c;
 
 a:integer | c:integer
 1 | 2
 ;
 
 chaining
-row a = 1, b = 2 | rename c = a, d = c, e = d;
+row a = 1, b = 2 | rename a as c, c as d, d as e;
 
 e:integer | b:integer
 1 | 2
 ;
 
 chainReuse
-row a = 1, b = 2 | rename c = a, d = c, c = b;
+row a = 1, b = 2 | rename a as c, c as d, b as c;
 
 d:integer | c:integer
 1 | 2
 ;
 
 effectivelyANop
-row a = 1, b = 2 | rename c = a, a = c;
+row a = 1, b = 2 | rename a as c, c as a;
 
 a:integer | b:integer
 1 | 2
 ;
 
 reuseAlias
-row a = 1, b = 2 | rename c = a, c = b;
+row a = 1, b = 2 | rename a as c, b as c;
 
 c:integer
 2
 ;
 
 unquotedNamesWithAt
-row @a = 10 | rename @b = @a | eval @c = @b + 1;
+row @a = 10 | rename @a as @b | eval @c = @b + 1;
 
 @b:integer | @c:integer
 10         | 11
 ;
 
 renameEval
-row a = 1, b = 2 | rename c = a | eval e = b + c;
+row a = 1, b = 2 | rename a as c | eval e = b + c;
 
 c:integer | b:integer | e:integer
 1 | 2 | 3
 ;
 
 rowRenameEvalProject
-row a = 1, b = 2 | rename c = a | keep c | eval e = 2 * c | keep e, c;
+row a = 1, b = 2 | rename a as c | keep c | eval e = 2 * c | keep e, c;
 
 e:integer | c:integer
 2 | 1
 ;
 
 rowRenameNop
-row a = 1, b = 2 | rename a = a;
+row a = 1, b = 2 | rename a as a;
 
 a:integer | b:integer
 1         | 2
 ;
 
 rowRenameDrop
-row a = 1, b = 2, c = 3 | rename d = a | drop b;
+row a = 1, b = 2, c = 3 | rename a as d | drop b;
 
 d:integer | c:integer
 1         | 3
 ;
 
 renameEvalProject
-from employees | rename x = languages | keep x | eval z = 2 * x | keep x, z | limit 3;
+from employees | rename languages as x | keep x | eval z = 2 * x | keep x, z | limit 3;
 
 x:integer | z:integer
 2 | 4
@@ -85,7 +85,7 @@ x:integer | z:integer
 ;
 
 renameProjectEval
-from employees | eval y = languages | rename x = languages | keep x, y | eval x2 = x + 1 | eval y2 = y + 2 | limit 3;
+from employees | eval y = languages | rename languages as x | keep x, y | eval x2 = x + 1 | eval y2 = y + 2 | limit 3;
 
 x:integer | y:integer | x2:integer | y2:integer
 2 | 2 | 3 | 4
@@ -94,7 +94,7 @@ x:integer | y:integer | x2:integer | y2:integer
 ;
 
 renameWithFilterPushedToES
-from employees | rename x = emp_no | keep languages, first_name, last_name, x | where x > 10030 and x < 10040 | limit 5;
+from employees | rename emp_no as x | keep languages, first_name, last_name, x | where x > 10030 and x < 10040 | limit 5;
 
 languages:integer | first_name:keyword | last_name:keyword | x:integer
 4 | null | Joslin | 10031
@@ -105,7 +105,7 @@ languages:integer | first_name:keyword | last_name:keyword | x:integer
 ;
 
 renameNopProject
-from employees | rename emp_no = emp_no | keep emp_no, last_name | limit 3;
+from employees | rename emp_no as emp_no | keep emp_no, last_name | limit 3;
 
 emp_no:integer | last_name:keyword
 10001 | Facello
@@ -114,7 +114,7 @@ emp_no:integer | last_name:keyword
 ;
 
 renameOverride
-from employees | rename languages = emp_no | keep languages, last_name | limit 3;
+from employees | rename emp_no as languages | keep languages, last_name | limit 3;
 
 languages:integer | last_name:keyword
 10001 | Facello
@@ -123,7 +123,7 @@ languages:integer | last_name:keyword
 ;
 
 projectRenameDate
-from employees | sort hire_date | rename x = hire_date | keep emp_no, x | limit 5;
+from employees | sort hire_date | rename hire_date as x | keep emp_no, x | limit 5;
 
 emp_no:integer | x:date
 10009          | 1985-02-18T00:00:00.000Z            
@@ -136,7 +136,7 @@ emp_no:integer | x:date
 renameDrop
 from employees
  | sort hire_date
- | rename x = hire_date, y = emp_no
+ | rename hire_date as x, emp_no as y
  | drop first_name, last_name, gender, birth_date, salary, languages*, height*, still_hired, avg_worked_seconds, job_positions, is_rehired, salary_change* 
  | limit 5;
 

+ 3 - 3
x-pack/plugin/esql/qa/testFixtures/src/main/resources/stats.csv-spec

@@ -264,7 +264,7 @@ h:d  | languages:i
 ;
 
 groupByAlias
-from employees | rename l = languages | keep l, height | stats m = min(height) by l | sort l;
+from employees | rename languages as l | keep l, height | stats m = min(height) by l | sort l;
 
 m:d  | l:i
 1.42 | 1
@@ -296,7 +296,7 @@ c:long | gender:keyword | trunk_worked_seconds:long
 ;
 
 byStringAndLongWithAlias
-from employees | eval trunk_worked_seconds = avg_worked_seconds / 100000000 * 100000000 | rename g = gender, tws = trunk_worked_seconds | keep g, tws | stats c = count(g) by g, tws | sort c desc;
+from employees | eval trunk_worked_seconds = avg_worked_seconds / 100000000 * 100000000 | rename  gender as g, trunk_worked_seconds as tws | keep g, tws | stats c = count(g) by g, tws | sort c desc;
 
 c:long | g:keyword | tws:long
 30 | M | 300000000
@@ -400,7 +400,7 @@ c:long | d:date | gender:keyword | languages:integer
 ;
 
 byDateAndKeywordAndIntWithAlias
-from employees | eval d = date_trunc(hire_date, 1 year) | rename g = gender, l = languages, e = emp_no | keep d, g, l, e | stats c = count(e) by d, g, l | sort c desc, d, l desc | limit 10;
+from employees | eval d = date_trunc(hire_date, 1 year) | rename gender as g, languages as l, emp_no as e | keep d, g, l, e | stats c = count(e) by d, g, l | sort c desc, d, l desc | limit 10;
 
 c:long | d:date | g:keyword | l:integer
 3 | 1986-01-01T00:00:00.000Z | M | 2

+ 1 - 1
x-pack/plugin/esql/qa/testFixtures/src/main/resources/version.csv-spec

@@ -159,7 +159,7 @@ id:i           |name:s         |version:v      |o:v
 ;
 
 countVersion
-FROM apps | RENAME k = name | STATS v = COUNT(version) BY k | SORT k;
+FROM apps | RENAME name AS k | STATS v = COUNT(version) BY k | SORT k;
 
 v:l     | k:s
 2       | aaaaa

+ 8 - 8
x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/action/EsqlActionIT.java

@@ -399,7 +399,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testFromStatsProjectGroupWithAlias() {
-        String query = "from test | stats avg_count = avg(count) by data | eval d2 = data | rename d = data | keep d, d2";
+        String query = "from test | stats avg_count = avg(count) by data | eval d2 = data | rename data as d | keep d, d2";
         EsqlQueryResponse results = run(query);
         logger.info(results);
         assertThat(results.columns().stream().map(ColumnInfo::name).toList(), contains("d", "d2"));
@@ -416,7 +416,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testFromStatsProjectAggWithAlias() {
-        EsqlQueryResponse results = run("from test | stats a = avg(count) by data | rename b = a | keep b");
+        EsqlQueryResponse results = run("from test | stats a = avg(count) by data | rename a as b | keep b");
         logger.info(results);
         assertThat(results.columns().stream().map(ColumnInfo::name).toList(), contains("b"));
         assertThat(results.columns().stream().map(ColumnInfo::type).toList(), contains("double"));
@@ -424,7 +424,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testFromProjectStatsGroupByAlias() {
-        EsqlQueryResponse results = run("from test | rename d = data | keep d, count | stats avg(count) by d");
+        EsqlQueryResponse results = run("from test | rename data as d | keep d, count | stats avg(count) by d");
         logger.info(results);
         assertThat(results.columns().stream().map(ColumnInfo::name).toList(), contains("avg(count)", "d"));
         assertThat(results.columns().stream().map(ColumnInfo::type).toList(), contains("double", "long"));
@@ -432,7 +432,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testFromProjectStatsAggregateAlias() {
-        EsqlQueryResponse results = run("from test | rename c = count | keep c, data | stats avg(c) by data");
+        EsqlQueryResponse results = run("from test | rename count as c | keep c, data | stats avg(c) by data");
         logger.info(results);
         assertThat(results.columns().stream().map(ColumnInfo::name).toList(), contains("avg(c)", "data"));
         assertThat(results.columns().stream().map(ColumnInfo::type).toList(), contains("double", "long"));
@@ -567,7 +567,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testProjectRename() {
-        EsqlQueryResponse results = run("from test | eval y = count | rename x = count | keep x, y");
+        EsqlQueryResponse results = run("from test | eval y = count | rename count as x | keep x, y");
         logger.info(results);
         Assert.assertEquals(40, results.values().size());
         assertThat(results.columns(), contains(new ColumnInfo("x", "long"), new ColumnInfo("y", "long")));
@@ -578,7 +578,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testProjectRenameEval() {
-        EsqlQueryResponse results = run("from test | eval y = count | rename x = count | keep x, y | eval x2 = x + 1 | eval y2 = y + 2");
+        EsqlQueryResponse results = run("from test | eval y = count | rename count as x | keep x, y | eval x2 = x + 1 | eval y2 = y + 2");
         logger.info(results);
         Assert.assertEquals(40, results.values().size());
         assertThat(
@@ -594,7 +594,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testProjectRenameEvalProject() {
-        EsqlQueryResponse results = run("from test | eval y = count | rename x = count | keep x, y | eval z = x + y | keep x, y, z");
+        EsqlQueryResponse results = run("from test | eval y = count | rename count as x | keep x, y | eval z = x + y | keep x, y, z");
         logger.info(results);
         Assert.assertEquals(40, results.values().size());
         assertThat(results.columns(), contains(new ColumnInfo("x", "long"), new ColumnInfo("y", "long"), new ColumnInfo("z", "long")));
@@ -606,7 +606,7 @@ public class EsqlActionIT extends AbstractEsqlIntegTestCase {
     }
 
     public void testProjectOverride() {
-        EsqlQueryResponse results = run("from test | eval cnt = count | rename data = count | keep cnt, data");
+        EsqlQueryResponse results = run("from test | eval cnt = count | rename count as data | keep cnt, data");
         logger.info(results);
         Assert.assertEquals(40, results.values().size());
         assertThat(results.columns(), contains(new ColumnInfo("cnt", "long"), new ColumnInfo("data", "long")));

+ 1 - 0
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4

@@ -159,6 +159,7 @@ SRC_OPENING_BRACKET : '[' -> type(OPENING_BRACKET), pushMode(SOURCE_IDENTIFIERS)
 SRC_CLOSING_BRACKET : ']' -> popMode, popMode, type(CLOSING_BRACKET);
 SRC_COMMA : ',' -> type(COMMA);
 SRC_ASSIGN : '=' -> type(ASSIGN);
+AS : 'as';
 METADATA: 'metadata';
 ON : 'on';
 WITH : 'with';

+ 14 - 12
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens

@@ -68,15 +68,16 @@ QUOTED_IDENTIFIER=67
 EXPR_LINE_COMMENT=68
 EXPR_MULTILINE_COMMENT=69
 EXPR_WS=70
-METADATA=71
-ON=72
-WITH=73
-SRC_UNQUOTED_IDENTIFIER=74
-SRC_QUOTED_IDENTIFIER=75
-SRC_LINE_COMMENT=76
-SRC_MULTILINE_COMMENT=77
-SRC_WS=78
-EXPLAIN_PIPE=79
+AS=71
+METADATA=72
+ON=73
+WITH=74
+SRC_UNQUOTED_IDENTIFIER=75
+SRC_QUOTED_IDENTIFIER=76
+SRC_LINE_COMMENT=77
+SRC_MULTILINE_COMMENT=78
+SRC_WS=79
+EXPLAIN_PIPE=80
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -128,6 +129,7 @@ EXPLAIN_PIPE=79
 '/'=62
 '%'=63
 ']'=65
-'metadata'=71
-'on'=72
-'with'=73
+'as'=71
+'metadata'=72
+'on'=73
+'with'=74

+ 1 - 1
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4

@@ -171,7 +171,7 @@ renameCommand
     ;
 
 renameClause:
-    newName=sourceIdentifier ASSIGN oldName=sourceIdentifier
+    oldName=sourceIdentifier AS newName=sourceIdentifier
     ;
 
 dissectCommand

+ 14 - 12
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens

@@ -68,15 +68,16 @@ QUOTED_IDENTIFIER=67
 EXPR_LINE_COMMENT=68
 EXPR_MULTILINE_COMMENT=69
 EXPR_WS=70
-METADATA=71
-ON=72
-WITH=73
-SRC_UNQUOTED_IDENTIFIER=74
-SRC_QUOTED_IDENTIFIER=75
-SRC_LINE_COMMENT=76
-SRC_MULTILINE_COMMENT=77
-SRC_WS=78
-EXPLAIN_PIPE=79
+AS=71
+METADATA=72
+ON=73
+WITH=74
+SRC_UNQUOTED_IDENTIFIER=75
+SRC_QUOTED_IDENTIFIER=76
+SRC_LINE_COMMENT=77
+SRC_MULTILINE_COMMENT=78
+SRC_WS=79
+EXPLAIN_PIPE=80
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -128,6 +129,7 @@ EXPLAIN_PIPE=79
 '/'=62
 '%'=63
 ']'=65
-'metadata'=71
-'on'=72
-'with'=73
+'as'=71
+'metadata'=72
+'on'=73
+'with'=74

+ 4 - 4
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Analyzer.java

@@ -436,12 +436,12 @@ public class Analyzer extends ParameterizedRuleExecutor<LogicalPlan, AnalyzerCon
 
             int renamingsCount = rename.renamings().size();
             List<NamedExpression> unresolved = new ArrayList<>(renamingsCount);
-            Map<String, String> reverseAliasing = new HashMap<>(renamingsCount); // `| rename x = a` => map(a: x)
+            Map<String, String> reverseAliasing = new HashMap<>(renamingsCount); // `| rename a as x` => map(a: x)
 
             rename.renamings().forEach(alias -> {
-                // skip NOPs: `| rename a = a`
+                // skip NOPs: `| rename a as a`
                 if (alias.child() instanceof UnresolvedAttribute ua && alias.name().equals(ua.name()) == false) {
-                    // remove attributes overwritten by a renaming: `| keep a, b, c | rename b = a`
+                    // remove attributes overwritten by a renaming: `| keep a, b, c | rename a as b`
                     projections.removeIf(x -> x.name().equals(alias.name()));
 
                     var resolved = resolveAttribute(ua, childrenOutput);
@@ -455,7 +455,7 @@ public class Analyzer extends ParameterizedRuleExecutor<LogicalPlan, AnalyzerCon
                         boolean updated = false;
                         if (reverseAliasing.containsValue(resolved.name())) {
                             for (var li = projections.listIterator(); li.hasNext();) {
-                                // does alias still exist? i.e. it hasn't been renamed again (`| rename b=a, c=b, d=b`)
+                                // does alias still exist? i.e. it hasn't been renamed again (`| rename a as b, b as c, b as d`)
                                 if (li.next() instanceof Alias a && a.name().equals(resolved.name())) {
                                     reverseAliasing.put(resolved.name(), alias.name());
                                     // update aliased projection in place

File diff suppressed because it is too large
+ 3 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp


+ 440 - 436
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java

@@ -27,9 +27,9 @@ public class EsqlBaseLexer extends Lexer {
     RP=49, TRUE=50, INFO=51, FUNCTIONS=52, EQ=53, NEQ=54, LT=55, LTE=56, GT=57, 
     GTE=58, PLUS=59, MINUS=60, ASTERISK=61, SLASH=62, PERCENT=63, OPENING_BRACKET=64, 
     CLOSING_BRACKET=65, UNQUOTED_IDENTIFIER=66, QUOTED_IDENTIFIER=67, EXPR_LINE_COMMENT=68, 
-    EXPR_MULTILINE_COMMENT=69, EXPR_WS=70, METADATA=71, ON=72, WITH=73, SRC_UNQUOTED_IDENTIFIER=74, 
-    SRC_QUOTED_IDENTIFIER=75, SRC_LINE_COMMENT=76, SRC_MULTILINE_COMMENT=77, 
-    SRC_WS=78, EXPLAIN_PIPE=79;
+    EXPR_MULTILINE_COMMENT=69, EXPR_WS=70, AS=71, METADATA=72, ON=73, WITH=74, 
+    SRC_UNQUOTED_IDENTIFIER=75, SRC_QUOTED_IDENTIFIER=76, SRC_LINE_COMMENT=77, 
+    SRC_MULTILINE_COMMENT=78, SRC_WS=79, EXPLAIN_PIPE=80;
   public static final int
     EXPLAIN_MODE=1, EXPRESSION=2, SOURCE_IDENTIFIERS=3;
   public static String[] channelNames = {
@@ -54,7 +54,7 @@ public class EsqlBaseLexer extends Lexer {
       "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", 
       "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", 
       "EXPR_WS", "SRC_PIPE", "SRC_OPENING_BRACKET", "SRC_CLOSING_BRACKET", 
-      "SRC_COMMA", "SRC_ASSIGN", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", 
+      "SRC_COMMA", "SRC_ASSIGN", "AS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", 
       "SRC_UNQUOTED_IDENTIFIER_PART", "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", 
       "SRC_MULTILINE_COMMENT", "SRC_WS"
     };
@@ -71,7 +71,7 @@ public class EsqlBaseLexer extends Lexer {
       "'('", "'in'", "'like'", "'not'", "'null'", "'nulls'", "'or'", "'?'", 
       "'rlike'", "')'", "'true'", "'info'", "'functions'", "'=='", "'!='", 
       "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, 
-      "']'", null, null, null, null, null, "'metadata'", "'on'", "'with'"
+      "']'", null, null, null, null, null, "'as'", "'metadata'", "'on'", "'with'"
     };
   }
   private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -87,8 +87,9 @@ public class EsqlBaseLexer extends Lexer {
       "INFO", "FUNCTIONS", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", 
       "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", 
       "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", 
-      "EXPR_WS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", "SRC_QUOTED_IDENTIFIER", 
-      "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", "SRC_WS", "EXPLAIN_PIPE"
+      "EXPR_WS", "AS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", 
+      "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", 
+      "SRC_WS", "EXPLAIN_PIPE"
     };
   }
   private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -150,7 +151,7 @@ public class EsqlBaseLexer extends Lexer {
   public ATN getATN() { return _ATN; }
 
   public static final String _serializedATN =
-    "\u0004\u0000O\u02f2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
+    "\u0004\u0000P\u02f7\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+
     "\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
     "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+
     "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+
@@ -173,53 +174,53 @@ public class EsqlBaseLexer extends Lexer {
     "K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007O\u0002"+
     "P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007T\u0002"+
     "U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007Y\u0002"+
-    "Z\u0007Z\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+
-    "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001"+
+    "Z\u0007Z\u0002[\u0007[\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+
+    "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+
     "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+
-    "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+
-    "\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+
-    "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001"+
-    "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+
-    "\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+
-    "\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+
-    "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001"+
-    "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+
-    "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+
-    "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+
-    "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001"+
+    "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+
+    "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003"+
+    "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+
+    "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+
+    "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+
+    "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+
+    "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007"+
+    "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+
+    "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+
+    "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+
+    "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001"+
     "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+
-    "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+
-    "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001"+
-    "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001"+
-    "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+
-    "\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+
-    "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+
-    "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+
-    "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+
-    "\u0011\u0001\u0011\u0001\u0012\u0004\u0012\u0155\b\u0012\u000b\u0012\f"+
-    "\u0012\u0156\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+
-    "\u0001\u0013\u0005\u0013\u015f\b\u0013\n\u0013\f\u0013\u0162\t\u0013\u0001"+
-    "\u0013\u0003\u0013\u0165\b\u0013\u0001\u0013\u0003\u0013\u0168\b\u0013"+
-    "\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+
-    "\u0001\u0014\u0005\u0014\u0171\b\u0014\n\u0014\f\u0014\u0174\t\u0014\u0001"+
-    "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0004"+
-    "\u0015\u017c\b\u0015\u000b\u0015\f\u0015\u017d\u0001\u0015\u0001\u0015"+
-    "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017"+
-    "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+
-    "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
-    "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b"+
-    "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d"+
-    "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001"+
-    " \u0003 \u01a7\b \u0001 \u0004 \u01aa\b \u000b \f \u01ab\u0001!\u0001"+
-    "!\u0001!\u0005!\u01b1\b!\n!\f!\u01b4\t!\u0001!\u0001!\u0001!\u0001!\u0001"+
-    "!\u0001!\u0005!\u01bc\b!\n!\f!\u01bf\t!\u0001!\u0001!\u0001!\u0001!\u0001"+
-    "!\u0003!\u01c6\b!\u0001!\u0003!\u01c9\b!\u0003!\u01cb\b!\u0001\"\u0004"+
-    "\"\u01ce\b\"\u000b\"\f\"\u01cf\u0001#\u0004#\u01d3\b#\u000b#\f#\u01d4"+
-    "\u0001#\u0001#\u0005#\u01d9\b#\n#\f#\u01dc\t#\u0001#\u0001#\u0004#\u01e0"+
-    "\b#\u000b#\f#\u01e1\u0001#\u0004#\u01e5\b#\u000b#\f#\u01e6\u0001#\u0001"+
-    "#\u0005#\u01eb\b#\n#\f#\u01ee\t#\u0003#\u01f0\b#\u0001#\u0001#\u0001#"+
-    "\u0001#\u0004#\u01f6\b#\u000b#\f#\u01f7\u0001#\u0001#\u0003#\u01fc\b#"+
-    "\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+
+    "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+
+    "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001"+
+    "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+
+    "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e"+
+    "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+
+    "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+
+    "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+
+    "\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+
+    "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0004\u0012\u0157\b\u0012"+
+    "\u000b\u0012\f\u0012\u0158\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013"+
+    "\u0001\u0013\u0001\u0013\u0005\u0013\u0161\b\u0013\n\u0013\f\u0013\u0164"+
+    "\t\u0013\u0001\u0013\u0003\u0013\u0167\b\u0013\u0001\u0013\u0003\u0013"+
+    "\u016a\b\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014"+
+    "\u0001\u0014\u0001\u0014\u0005\u0014\u0173\b\u0014\n\u0014\f\u0014\u0176"+
+    "\t\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+
+    "\u0015\u0004\u0015\u017e\b\u0015\u000b\u0015\f\u0015\u017f\u0001\u0015"+
+    "\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+
+    "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018"+
+    "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+
+    "\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b"+
+    "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d"+
+    "\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f"+
+    "\u0001 \u0001 \u0003 \u01a9\b \u0001 \u0004 \u01ac\b \u000b \f \u01ad"+
+    "\u0001!\u0001!\u0001!\u0005!\u01b3\b!\n!\f!\u01b6\t!\u0001!\u0001!\u0001"+
+    "!\u0001!\u0001!\u0001!\u0005!\u01be\b!\n!\f!\u01c1\t!\u0001!\u0001!\u0001"+
+    "!\u0001!\u0001!\u0003!\u01c8\b!\u0001!\u0003!\u01cb\b!\u0003!\u01cd\b"+
+    "!\u0001\"\u0004\"\u01d0\b\"\u000b\"\f\"\u01d1\u0001#\u0004#\u01d5\b#\u000b"+
+    "#\f#\u01d6\u0001#\u0001#\u0005#\u01db\b#\n#\f#\u01de\t#\u0001#\u0001#"+
+    "\u0004#\u01e2\b#\u000b#\f#\u01e3\u0001#\u0004#\u01e7\b#\u000b#\f#\u01e8"+
+    "\u0001#\u0001#\u0005#\u01ed\b#\n#\f#\u01f0\t#\u0003#\u01f2\b#\u0001#\u0001"+
+    "#\u0001#\u0001#\u0004#\u01f8\b#\u000b#\f#\u01f9\u0001#\u0001#\u0003#\u01fe"+
+    "\b#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+
     "&\u0001&\u0001\'\u0001\'\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001"+
     ")\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001"+
     ",\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+
@@ -232,394 +233,397 @@ public class EsqlBaseLexer extends Lexer {
     ";\u0001<\u0001<\u0001<\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001"+
     "?\u0001@\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001C\u0001C\u0001"+
     "D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001F\u0001G\u0001"+
-    "G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0005H\u0287\bH\nH"+
-    "\fH\u028a\tH\u0001H\u0001H\u0001H\u0001H\u0004H\u0290\bH\u000bH\fH\u0291"+
-    "\u0003H\u0294\bH\u0001I\u0001I\u0001I\u0001I\u0005I\u029a\bI\nI\fI\u029d"+
+    "G\u0001G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0005H\u0289\bH\nH"+
+    "\fH\u028c\tH\u0001H\u0001H\u0001H\u0001H\u0004H\u0292\bH\u000bH\fH\u0293"+
+    "\u0003H\u0296\bH\u0001I\u0001I\u0001I\u0001I\u0005I\u029c\bI\nI\fI\u029f"+
     "\tI\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001"+
     "K\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+
     "N\u0001N\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001"+
     "O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+
-    "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001"+
-    "S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0004U\u02d8\bU\u000b"+
-    "U\fU\u02d9\u0001V\u0004V\u02dd\bV\u000bV\fV\u02de\u0001V\u0001V\u0003"+
-    "V\u02e3\bV\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+
-    "Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0002\u0172\u01bd\u0000[\u0004\u0001"+
-    "\u0006\u0002\b\u0003\n\u0004\f\u0005\u000e\u0006\u0010\u0007\u0012\b\u0014"+
-    "\t\u0016\n\u0018\u000b\u001a\f\u001c\r\u001e\u000e \u000f\"\u0010$\u0011"+
-    "&\u0012(\u0013*\u0014,\u0015.\u00160\u00002O4\u00176\u00188\u0019:\u001a"+
-    "<\u0000>\u0000@\u0000B\u0000D\u0000F\u001bH\u001cJ\u001dL\u001eN\u001f"+
-    "P R!T\"V#X$Z%\\&^\'`(b)d*f+h,j-l.n/p0r1t2v3x4z5|6~7\u00808\u00829\u0084"+
-    ":\u0086;\u0088<\u008a=\u008c>\u008e?\u0090@\u0092A\u0094B\u0096C\u0098"+
-    "D\u009aE\u009cF\u009e\u0000\u00a0\u0000\u00a2\u0000\u00a4\u0000\u00a6"+
-    "\u0000\u00a8G\u00aaH\u00acI\u00aeJ\u00b0\u0000\u00b2K\u00b4L\u00b6M\u00b8"+
-    "N\u0004\u0000\u0001\u0002\u0003\r\u0006\u0000\t\n\r\r  //[[]]\u0002\u0000"+
-    "\n\n\r\r\u0003\u0000\t\n\r\r  \u0001\u000009\u0002\u0000AZaz\u0005\u0000"+
-    "\"\"\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000EEee\u0002\u0000"+
-    "++--\u0002\u0000@@__\u0001\u0000``\n\u0000\t\n\r\r  ,,//==[[]]``||\u0002"+
-    "\u0000**//\u030e\u0000\u0004\u0001\u0000\u0000\u0000\u0000\u0006\u0001"+
-    "\u0000\u0000\u0000\u0000\b\u0001\u0000\u0000\u0000\u0000\n\u0001\u0000"+
-    "\u0000\u0000\u0000\f\u0001\u0000\u0000\u0000\u0000\u000e\u0001\u0000\u0000"+
-    "\u0000\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000"+
-    "\u0000\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000"+
-    "\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000"+
-    "\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000"+
-    "\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000"+
-    "\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000("+
-    "\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000"+
-    "\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00010\u0001\u0000\u0000\u0000"+
-    "\u00012\u0001\u0000\u0000\u0000\u00014\u0001\u0000\u0000\u0000\u00016"+
-    "\u0001\u0000\u0000\u0000\u00018\u0001\u0000\u0000\u0000\u0002:\u0001\u0000"+
-    "\u0000\u0000\u0002F\u0001\u0000\u0000\u0000\u0002H\u0001\u0000\u0000\u0000"+
-    "\u0002J\u0001\u0000\u0000\u0000\u0002L\u0001\u0000\u0000\u0000\u0002N"+
-    "\u0001\u0000\u0000\u0000\u0002P\u0001\u0000\u0000\u0000\u0002R\u0001\u0000"+
-    "\u0000\u0000\u0002T\u0001\u0000\u0000\u0000\u0002V\u0001\u0000\u0000\u0000"+
-    "\u0002X\u0001\u0000\u0000\u0000\u0002Z\u0001\u0000\u0000\u0000\u0002\\"+
-    "\u0001\u0000\u0000\u0000\u0002^\u0001\u0000\u0000\u0000\u0002`\u0001\u0000"+
-    "\u0000\u0000\u0002b\u0001\u0000\u0000\u0000\u0002d\u0001\u0000\u0000\u0000"+
-    "\u0002f\u0001\u0000\u0000\u0000\u0002h\u0001\u0000\u0000\u0000\u0002j"+
-    "\u0001\u0000\u0000\u0000\u0002l\u0001\u0000\u0000\u0000\u0002n\u0001\u0000"+
-    "\u0000\u0000\u0002p\u0001\u0000\u0000\u0000\u0002r\u0001\u0000\u0000\u0000"+
-    "\u0002t\u0001\u0000\u0000\u0000\u0002v\u0001\u0000\u0000\u0000\u0002x"+
-    "\u0001\u0000\u0000\u0000\u0002z\u0001\u0000\u0000\u0000\u0002|\u0001\u0000"+
-    "\u0000\u0000\u0002~\u0001\u0000\u0000\u0000\u0002\u0080\u0001\u0000\u0000"+
-    "\u0000\u0002\u0082\u0001\u0000\u0000\u0000\u0002\u0084\u0001\u0000\u0000"+
-    "\u0000\u0002\u0086\u0001\u0000\u0000\u0000\u0002\u0088\u0001\u0000\u0000"+
-    "\u0000\u0002\u008a\u0001\u0000\u0000\u0000\u0002\u008c\u0001\u0000\u0000"+
-    "\u0000\u0002\u008e\u0001\u0000\u0000\u0000\u0002\u0090\u0001\u0000\u0000"+
-    "\u0000\u0002\u0092\u0001\u0000\u0000\u0000\u0002\u0094\u0001\u0000\u0000"+
-    "\u0000\u0002\u0096\u0001\u0000\u0000\u0000\u0002\u0098\u0001\u0000\u0000"+
-    "\u0000\u0002\u009a\u0001\u0000\u0000\u0000\u0002\u009c\u0001\u0000\u0000"+
-    "\u0000\u0003\u009e\u0001\u0000\u0000\u0000\u0003\u00a0\u0001\u0000\u0000"+
-    "\u0000\u0003\u00a2\u0001\u0000\u0000\u0000\u0003\u00a4\u0001\u0000\u0000"+
-    "\u0000\u0003\u00a6\u0001\u0000\u0000\u0000\u0003\u00a8\u0001\u0000\u0000"+
-    "\u0000\u0003\u00aa\u0001\u0000\u0000\u0000\u0003\u00ac\u0001\u0000\u0000"+
-    "\u0000\u0003\u00ae\u0001\u0000\u0000\u0000\u0003\u00b2\u0001\u0000\u0000"+
-    "\u0000\u0003\u00b4\u0001\u0000\u0000\u0000\u0003\u00b6\u0001\u0000\u0000"+
-    "\u0000\u0003\u00b8\u0001\u0000\u0000\u0000\u0004\u00ba\u0001\u0000\u0000"+
-    "\u0000\u0006\u00c4\u0001\u0000\u0000\u0000\b\u00cb\u0001\u0000\u0000\u0000"+
-    "\n\u00d4\u0001\u0000\u0000\u0000\f\u00db\u0001\u0000\u0000\u0000\u000e"+
-    "\u00e5\u0001\u0000\u0000\u0000\u0010\u00ec\u0001\u0000\u0000\u0000\u0012"+
-    "\u00f3\u0001\u0000\u0000\u0000\u0014\u0101\u0001\u0000\u0000\u0000\u0016"+
-    "\u0108\u0001\u0000\u0000\u0000\u0018\u0110\u0001\u0000\u0000\u0000\u001a"+
-    "\u011c\u0001\u0000\u0000\u0000\u001c\u0126\u0001\u0000\u0000\u0000\u001e"+
-    "\u012f\u0001\u0000\u0000\u0000 \u0135\u0001\u0000\u0000\u0000\"\u013c"+
-    "\u0001\u0000\u0000\u0000$\u0143\u0001\u0000\u0000\u0000&\u014b\u0001\u0000"+
-    "\u0000\u0000(\u0154\u0001\u0000\u0000\u0000*\u015a\u0001\u0000\u0000\u0000"+
-    ",\u016b\u0001\u0000\u0000\u0000.\u017b\u0001\u0000\u0000\u00000\u0181"+
-    "\u0001\u0000\u0000\u00002\u0186\u0001\u0000\u0000\u00004\u018b\u0001\u0000"+
-    "\u0000\u00006\u018f\u0001\u0000\u0000\u00008\u0193\u0001\u0000\u0000\u0000"+
-    ":\u0197\u0001\u0000\u0000\u0000<\u019b\u0001\u0000\u0000\u0000>\u019d"+
-    "\u0001\u0000\u0000\u0000@\u019f\u0001\u0000\u0000\u0000B\u01a2\u0001\u0000"+
-    "\u0000\u0000D\u01a4\u0001\u0000\u0000\u0000F\u01ca\u0001\u0000\u0000\u0000"+
-    "H\u01cd\u0001\u0000\u0000\u0000J\u01fb\u0001\u0000\u0000\u0000L\u01fd"+
-    "\u0001\u0000\u0000\u0000N\u0200\u0001\u0000\u0000\u0000P\u0204\u0001\u0000"+
-    "\u0000\u0000R\u0208\u0001\u0000\u0000\u0000T\u020a\u0001\u0000\u0000\u0000"+
-    "V\u020c\u0001\u0000\u0000\u0000X\u0211\u0001\u0000\u0000\u0000Z\u0213"+
-    "\u0001\u0000\u0000\u0000\\\u0219\u0001\u0000\u0000\u0000^\u021f\u0001"+
-    "\u0000\u0000\u0000`\u0224\u0001\u0000\u0000\u0000b\u0226\u0001\u0000\u0000"+
-    "\u0000d\u0229\u0001\u0000\u0000\u0000f\u022e\u0001\u0000\u0000\u0000h"+
-    "\u0232\u0001\u0000\u0000\u0000j\u0237\u0001\u0000\u0000\u0000l\u023d\u0001"+
-    "\u0000\u0000\u0000n\u0240\u0001\u0000\u0000\u0000p\u0242\u0001\u0000\u0000"+
-    "\u0000r\u0248\u0001\u0000\u0000\u0000t\u024a\u0001\u0000\u0000\u0000v"+
-    "\u024f\u0001\u0000\u0000\u0000x\u0254\u0001\u0000\u0000\u0000z\u025e\u0001"+
-    "\u0000\u0000\u0000|\u0261\u0001\u0000\u0000\u0000~\u0264\u0001\u0000\u0000"+
-    "\u0000\u0080\u0266\u0001\u0000\u0000\u0000\u0082\u0269\u0001\u0000\u0000"+
-    "\u0000\u0084\u026b\u0001\u0000\u0000\u0000\u0086\u026e\u0001\u0000\u0000"+
-    "\u0000\u0088\u0270\u0001\u0000\u0000\u0000\u008a\u0272\u0001\u0000\u0000"+
-    "\u0000\u008c\u0274\u0001\u0000\u0000\u0000\u008e\u0276\u0001\u0000\u0000"+
-    "\u0000\u0090\u0278\u0001\u0000\u0000\u0000\u0092\u027d\u0001\u0000\u0000"+
-    "\u0000\u0094\u0293\u0001\u0000\u0000\u0000\u0096\u0295\u0001\u0000\u0000"+
-    "\u0000\u0098\u02a0\u0001\u0000\u0000\u0000\u009a\u02a4\u0001\u0000\u0000"+
-    "\u0000\u009c\u02a8\u0001\u0000\u0000\u0000\u009e\u02ac\u0001\u0000\u0000"+
-    "\u0000\u00a0\u02b1\u0001\u0000\u0000\u0000\u00a2\u02b7\u0001\u0000\u0000"+
-    "\u0000\u00a4\u02bd\u0001\u0000\u0000\u0000\u00a6\u02c1\u0001\u0000\u0000"+
-    "\u0000\u00a8\u02c5\u0001\u0000\u0000\u0000\u00aa\u02ce\u0001\u0000\u0000"+
-    "\u0000\u00ac\u02d1\u0001\u0000\u0000\u0000\u00ae\u02d7\u0001\u0000\u0000"+
-    "\u0000\u00b0\u02e2\u0001\u0000\u0000\u0000\u00b2\u02e4\u0001\u0000\u0000"+
-    "\u0000\u00b4\u02e6\u0001\u0000\u0000\u0000\u00b6\u02ea\u0001\u0000\u0000"+
-    "\u0000\u00b8\u02ee\u0001\u0000\u0000\u0000\u00ba\u00bb\u0005d\u0000\u0000"+
-    "\u00bb\u00bc\u0005i\u0000\u0000\u00bc\u00bd\u0005s\u0000\u0000\u00bd\u00be"+
-    "\u0005s\u0000\u0000\u00be\u00bf\u0005e\u0000\u0000\u00bf\u00c0\u0005c"+
-    "\u0000\u0000\u00c0\u00c1\u0005t\u0000\u0000\u00c1\u00c2\u0001\u0000\u0000"+
-    "\u0000\u00c2\u00c3\u0006\u0000\u0000\u0000\u00c3\u0005\u0001\u0000\u0000"+
-    "\u0000\u00c4\u00c5\u0005d\u0000\u0000\u00c5\u00c6\u0005r\u0000\u0000\u00c6"+
-    "\u00c7\u0005o\u0000\u0000\u00c7\u00c8\u0005p\u0000\u0000\u00c8\u00c9\u0001"+
-    "\u0000\u0000\u0000\u00c9\u00ca\u0006\u0001\u0001\u0000\u00ca\u0007\u0001"+
-    "\u0000\u0000\u0000\u00cb\u00cc\u0005e\u0000\u0000\u00cc\u00cd\u0005n\u0000"+
-    "\u0000\u00cd\u00ce\u0005r\u0000\u0000\u00ce\u00cf\u0005i\u0000\u0000\u00cf"+
-    "\u00d0\u0005c\u0000\u0000\u00d0\u00d1\u0005h\u0000\u0000\u00d1\u00d2\u0001"+
-    "\u0000\u0000\u0000\u00d2\u00d3\u0006\u0002\u0001\u0000\u00d3\t\u0001\u0000"+
-    "\u0000\u0000\u00d4\u00d5\u0005e\u0000\u0000\u00d5\u00d6\u0005v\u0000\u0000"+
-    "\u00d6\u00d7\u0005a\u0000\u0000\u00d7\u00d8\u0005l\u0000\u0000\u00d8\u00d9"+
-    "\u0001\u0000\u0000\u0000\u00d9\u00da\u0006\u0003\u0000\u0000\u00da\u000b"+
-    "\u0001\u0000\u0000\u0000\u00db\u00dc\u0005e\u0000\u0000\u00dc\u00dd\u0005"+
-    "x\u0000\u0000\u00dd\u00de\u0005p\u0000\u0000\u00de\u00df\u0005l\u0000"+
-    "\u0000\u00df\u00e0\u0005a\u0000\u0000\u00e0\u00e1\u0005i\u0000\u0000\u00e1"+
-    "\u00e2\u0005n\u0000\u0000\u00e2\u00e3\u0001\u0000\u0000\u0000\u00e3\u00e4"+
-    "\u0006\u0004\u0002\u0000\u00e4\r\u0001\u0000\u0000\u0000\u00e5\u00e6\u0005"+
-    "f\u0000\u0000\u00e6\u00e7\u0005r\u0000\u0000\u00e7\u00e8\u0005o\u0000"+
-    "\u0000\u00e8\u00e9\u0005m\u0000\u0000\u00e9\u00ea\u0001\u0000\u0000\u0000"+
-    "\u00ea\u00eb\u0006\u0005\u0001\u0000\u00eb\u000f\u0001\u0000\u0000\u0000"+
-    "\u00ec\u00ed\u0005g\u0000\u0000\u00ed\u00ee\u0005r\u0000\u0000\u00ee\u00ef"+
-    "\u0005o\u0000\u0000\u00ef\u00f0\u0005k\u0000\u0000\u00f0\u00f1\u0001\u0000"+
-    "\u0000\u0000\u00f1\u00f2\u0006\u0006\u0000\u0000\u00f2\u0011\u0001\u0000"+
-    "\u0000\u0000\u00f3\u00f4\u0005i\u0000\u0000\u00f4\u00f5\u0005n\u0000\u0000"+
-    "\u00f5\u00f6\u0005l\u0000\u0000\u00f6\u00f7\u0005i\u0000\u0000\u00f7\u00f8"+
-    "\u0005n\u0000\u0000\u00f8\u00f9\u0005e\u0000\u0000\u00f9\u00fa\u0005s"+
-    "\u0000\u0000\u00fa\u00fb\u0005t\u0000\u0000\u00fb\u00fc\u0005a\u0000\u0000"+
-    "\u00fc\u00fd\u0005t\u0000\u0000\u00fd\u00fe\u0005s\u0000\u0000\u00fe\u00ff"+
-    "\u0001\u0000\u0000\u0000\u00ff\u0100\u0006\u0007\u0000\u0000\u0100\u0013"+
-    "\u0001\u0000\u0000\u0000\u0101\u0102\u0005k\u0000\u0000\u0102\u0103\u0005"+
-    "e\u0000\u0000\u0103\u0104\u0005e\u0000\u0000\u0104\u0105\u0005p\u0000"+
-    "\u0000\u0105\u0106\u0001\u0000\u0000\u0000\u0106\u0107\u0006\b\u0001\u0000"+
-    "\u0107\u0015\u0001\u0000\u0000\u0000\u0108\u0109\u0005l\u0000\u0000\u0109"+
-    "\u010a\u0005i\u0000\u0000\u010a\u010b\u0005m\u0000\u0000\u010b\u010c\u0005"+
-    "i\u0000\u0000\u010c\u010d\u0005t\u0000\u0000\u010d\u010e\u0001\u0000\u0000"+
-    "\u0000\u010e\u010f\u0006\t\u0000\u0000\u010f\u0017\u0001\u0000\u0000\u0000"+
-    "\u0110\u0111\u0005m\u0000\u0000\u0111\u0112\u0005v\u0000\u0000\u0112\u0113"+
-    "\u0005_\u0000\u0000\u0113\u0114\u0005e\u0000\u0000\u0114\u0115\u0005x"+
-    "\u0000\u0000\u0115\u0116\u0005p\u0000\u0000\u0116\u0117\u0005a\u0000\u0000"+
-    "\u0117\u0118\u0005n\u0000\u0000\u0118\u0119\u0005d\u0000\u0000\u0119\u011a"+
-    "\u0001\u0000\u0000\u0000\u011a\u011b\u0006\n\u0001\u0000\u011b\u0019\u0001"+
-    "\u0000\u0000\u0000\u011c\u011d\u0005p\u0000\u0000\u011d\u011e\u0005r\u0000"+
-    "\u0000\u011e\u011f\u0005o\u0000\u0000\u011f\u0120\u0005j\u0000\u0000\u0120"+
-    "\u0121\u0005e\u0000\u0000\u0121\u0122\u0005c\u0000\u0000\u0122\u0123\u0005"+
-    "t\u0000\u0000\u0123\u0124\u0001\u0000\u0000\u0000\u0124\u0125\u0006\u000b"+
-    "\u0001\u0000\u0125\u001b\u0001\u0000\u0000\u0000\u0126\u0127\u0005r\u0000"+
-    "\u0000\u0127\u0128\u0005e\u0000\u0000\u0128\u0129\u0005n\u0000\u0000\u0129"+
-    "\u012a\u0005a\u0000\u0000\u012a\u012b\u0005m\u0000\u0000\u012b\u012c\u0005"+
-    "e\u0000\u0000\u012c\u012d\u0001\u0000\u0000\u0000\u012d\u012e\u0006\f"+
-    "\u0001\u0000\u012e\u001d\u0001\u0000\u0000\u0000\u012f\u0130\u0005r\u0000"+
-    "\u0000\u0130\u0131\u0005o\u0000\u0000\u0131\u0132\u0005w\u0000\u0000\u0132"+
-    "\u0133\u0001\u0000\u0000\u0000\u0133\u0134\u0006\r\u0000\u0000\u0134\u001f"+
-    "\u0001\u0000\u0000\u0000\u0135\u0136\u0005s\u0000\u0000\u0136\u0137\u0005"+
-    "h\u0000\u0000\u0137\u0138\u0005o\u0000\u0000\u0138\u0139\u0005w\u0000"+
-    "\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0006\u000e\u0000"+
-    "\u0000\u013b!\u0001\u0000\u0000\u0000\u013c\u013d\u0005s\u0000\u0000\u013d"+
-    "\u013e\u0005o\u0000\u0000\u013e\u013f\u0005r\u0000\u0000\u013f\u0140\u0005"+
-    "t\u0000\u0000\u0140\u0141\u0001\u0000\u0000\u0000\u0141\u0142\u0006\u000f"+
-    "\u0000\u0000\u0142#\u0001\u0000\u0000\u0000\u0143\u0144\u0005s\u0000\u0000"+
-    "\u0144\u0145\u0005t\u0000\u0000\u0145\u0146\u0005a\u0000\u0000\u0146\u0147"+
-    "\u0005t\u0000\u0000\u0147\u0148\u0005s\u0000\u0000\u0148\u0149\u0001\u0000"+
-    "\u0000\u0000\u0149\u014a\u0006\u0010\u0000\u0000\u014a%\u0001\u0000\u0000"+
-    "\u0000\u014b\u014c\u0005w\u0000\u0000\u014c\u014d\u0005h\u0000\u0000\u014d"+
-    "\u014e\u0005e\u0000\u0000\u014e\u014f\u0005r\u0000\u0000\u014f\u0150\u0005"+
-    "e\u0000\u0000\u0150\u0151\u0001\u0000\u0000\u0000\u0151\u0152\u0006\u0011"+
-    "\u0000\u0000\u0152\'\u0001\u0000\u0000\u0000\u0153\u0155\b\u0000\u0000"+
-    "\u0000\u0154\u0153\u0001\u0000\u0000\u0000\u0155\u0156\u0001\u0000\u0000"+
-    "\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0156\u0157\u0001\u0000\u0000"+
-    "\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158\u0159\u0006\u0012\u0000"+
-    "\u0000\u0159)\u0001\u0000\u0000\u0000\u015a\u015b\u0005/\u0000\u0000\u015b"+
-    "\u015c\u0005/\u0000\u0000\u015c\u0160\u0001\u0000\u0000\u0000\u015d\u015f"+
-    "\b\u0001\u0000\u0000\u015e\u015d\u0001\u0000\u0000\u0000\u015f\u0162\u0001"+
-    "\u0000\u0000\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0160\u0161\u0001"+
-    "\u0000\u0000\u0000\u0161\u0164\u0001\u0000\u0000\u0000\u0162\u0160\u0001"+
-    "\u0000\u0000\u0000\u0163\u0165\u0005\r\u0000\u0000\u0164\u0163\u0001\u0000"+
-    "\u0000\u0000\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u0167\u0001\u0000"+
-    "\u0000\u0000\u0166\u0168\u0005\n\u0000\u0000\u0167\u0166\u0001\u0000\u0000"+
-    "\u0000\u0167\u0168\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000\u0000"+
-    "\u0000\u0169\u016a\u0006\u0013\u0003\u0000\u016a+\u0001\u0000\u0000\u0000"+
-    "\u016b\u016c\u0005/\u0000\u0000\u016c\u016d\u0005*\u0000\u0000\u016d\u0172"+
-    "\u0001\u0000\u0000\u0000\u016e\u0171\u0003,\u0014\u0000\u016f\u0171\t"+
-    "\u0000\u0000\u0000\u0170\u016e\u0001\u0000\u0000\u0000\u0170\u016f\u0001"+
-    "\u0000\u0000\u0000\u0171\u0174\u0001\u0000\u0000\u0000\u0172\u0173\u0001"+
-    "\u0000\u0000\u0000\u0172\u0170\u0001\u0000\u0000\u0000\u0173\u0175\u0001"+
-    "\u0000\u0000\u0000\u0174\u0172\u0001\u0000\u0000\u0000\u0175\u0176\u0005"+
-    "*\u0000\u0000\u0176\u0177\u0005/\u0000\u0000\u0177\u0178\u0001\u0000\u0000"+
-    "\u0000\u0178\u0179\u0006\u0014\u0003\u0000\u0179-\u0001\u0000\u0000\u0000"+
-    "\u017a\u017c\u0007\u0002\u0000\u0000\u017b\u017a\u0001\u0000\u0000\u0000"+
-    "\u017c\u017d\u0001\u0000\u0000\u0000\u017d\u017b\u0001\u0000\u0000\u0000"+
-    "\u017d\u017e\u0001\u0000\u0000\u0000\u017e\u017f\u0001\u0000\u0000\u0000"+
-    "\u017f\u0180\u0006\u0015\u0003\u0000\u0180/\u0001\u0000\u0000\u0000\u0181"+
-    "\u0182\u0005[\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0184"+
-    "\u0006\u0016\u0004\u0000\u0184\u0185\u0006\u0016\u0005\u0000\u01851\u0001"+
-    "\u0000\u0000\u0000\u0186\u0187\u0005|\u0000\u0000\u0187\u0188\u0001\u0000"+
-    "\u0000\u0000\u0188\u0189\u0006\u0017\u0006\u0000\u0189\u018a\u0006\u0017"+
-    "\u0007\u0000\u018a3\u0001\u0000\u0000\u0000\u018b\u018c\u0003.\u0015\u0000"+
-    "\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u018e\u0006\u0018\u0003\u0000"+
-    "\u018e5\u0001\u0000\u0000\u0000\u018f\u0190\u0003*\u0013\u0000\u0190\u0191"+
-    "\u0001\u0000\u0000\u0000\u0191\u0192\u0006\u0019\u0003\u0000\u01927\u0001"+
-    "\u0000\u0000\u0000\u0193\u0194\u0003,\u0014\u0000\u0194\u0195\u0001\u0000"+
-    "\u0000\u0000\u0195\u0196\u0006\u001a\u0003\u0000\u01969\u0001\u0000\u0000"+
-    "\u0000\u0197\u0198\u0005|\u0000\u0000\u0198\u0199\u0001\u0000\u0000\u0000"+
-    "\u0199\u019a\u0006\u001b\u0007\u0000\u019a;\u0001\u0000\u0000\u0000\u019b"+
-    "\u019c\u0007\u0003\u0000\u0000\u019c=\u0001\u0000\u0000\u0000\u019d\u019e"+
-    "\u0007\u0004\u0000\u0000\u019e?\u0001\u0000\u0000\u0000\u019f\u01a0\u0005"+
-    "\\\u0000\u0000\u01a0\u01a1\u0007\u0005\u0000\u0000\u01a1A\u0001\u0000"+
-    "\u0000\u0000\u01a2\u01a3\b\u0006\u0000\u0000\u01a3C\u0001\u0000\u0000"+
-    "\u0000\u01a4\u01a6\u0007\u0007\u0000\u0000\u01a5\u01a7\u0007\b\u0000\u0000"+
-    "\u01a6\u01a5\u0001\u0000\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000"+
-    "\u01a7\u01a9\u0001\u0000\u0000\u0000\u01a8\u01aa\u0003<\u001c\u0000\u01a9"+
-    "\u01a8\u0001\u0000\u0000\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab"+
-    "\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac"+
-    "E\u0001\u0000\u0000\u0000\u01ad\u01b2\u0005\"\u0000\u0000\u01ae\u01b1"+
-    "\u0003@\u001e\u0000\u01af\u01b1\u0003B\u001f\u0000\u01b0\u01ae\u0001\u0000"+
-    "\u0000\u0000\u01b0\u01af\u0001\u0000\u0000\u0000\u01b1\u01b4\u0001\u0000"+
-    "\u0000\u0000\u01b2\u01b0\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000"+
-    "\u0000\u0000\u01b3\u01b5\u0001\u0000\u0000\u0000\u01b4\u01b2\u0001\u0000"+
-    "\u0000\u0000\u01b5\u01cb\u0005\"\u0000\u0000\u01b6\u01b7\u0005\"\u0000"+
-    "\u0000\u01b7\u01b8\u0005\"\u0000\u0000\u01b8\u01b9\u0005\"\u0000\u0000"+
-    "\u01b9\u01bd\u0001\u0000\u0000\u0000\u01ba\u01bc\b\u0001\u0000\u0000\u01bb"+
-    "\u01ba\u0001\u0000\u0000\u0000\u01bc\u01bf\u0001\u0000\u0000\u0000\u01bd"+
-    "\u01be\u0001\u0000\u0000\u0000\u01bd\u01bb\u0001\u0000\u0000\u0000\u01be"+
+    "R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001S\u0001"+
+    "S\u0001S\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+
+    "V\u0004V\u02dd\bV\u000bV\fV\u02de\u0001W\u0004W\u02e2\bW\u000bW\fW\u02e3"+
+    "\u0001W\u0001W\u0003W\u02e8\bW\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001"+
+    "Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0002\u0174"+
+    "\u01bf\u0000\\\u0004\u0001\u0006\u0002\b\u0003\n\u0004\f\u0005\u000e\u0006"+
+    "\u0010\u0007\u0012\b\u0014\t\u0016\n\u0018\u000b\u001a\f\u001c\r\u001e"+
+    "\u000e \u000f\"\u0010$\u0011&\u0012(\u0013*\u0014,\u0015.\u00160\u0000"+
+    "2P4\u00176\u00188\u0019:\u001a<\u0000>\u0000@\u0000B\u0000D\u0000F\u001b"+
+    "H\u001cJ\u001dL\u001eN\u001fP R!T\"V#X$Z%\\&^\'`(b)d*f+h,j-l.n/p0r1t2"+
+    "v3x4z5|6~7\u00808\u00829\u0084:\u0086;\u0088<\u008a=\u008c>\u008e?\u0090"+
+    "@\u0092A\u0094B\u0096C\u0098D\u009aE\u009cF\u009e\u0000\u00a0\u0000\u00a2"+
+    "\u0000\u00a4\u0000\u00a6\u0000\u00a8G\u00aaH\u00acI\u00aeJ\u00b0K\u00b2"+
+    "\u0000\u00b4L\u00b6M\u00b8N\u00baO\u0004\u0000\u0001\u0002\u0003\r\u0006"+
+    "\u0000\t\n\r\r  //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r  \u0001"+
+    "\u000009\u0002\u0000AZaz\u0005\u0000\"\"\\\\nnrrtt\u0004\u0000\n\n\r\r"+
+    "\"\"\\\\\u0002\u0000EEee\u0002\u0000++--\u0002\u0000@@__\u0001\u0000`"+
+    "`\n\u0000\t\n\r\r  ,,//==[[]]``||\u0002\u0000**//\u0313\u0000\u0004\u0001"+
+    "\u0000\u0000\u0000\u0000\u0006\u0001\u0000\u0000\u0000\u0000\b\u0001\u0000"+
+    "\u0000\u0000\u0000\n\u0001\u0000\u0000\u0000\u0000\f\u0001\u0000\u0000"+
+    "\u0000\u0000\u000e\u0001\u0000\u0000\u0000\u0000\u0010\u0001\u0000\u0000"+
+    "\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000"+
+    "\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000"+
+    "\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000"+
+    "\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000"+
+    "\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000"+
+    "&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001"+
+    "\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000"+
+    "\u0000\u00010\u0001\u0000\u0000\u0000\u00012\u0001\u0000\u0000\u0000\u0001"+
+    "4\u0001\u0000\u0000\u0000\u00016\u0001\u0000\u0000\u0000\u00018\u0001"+
+    "\u0000\u0000\u0000\u0002:\u0001\u0000\u0000\u0000\u0002F\u0001\u0000\u0000"+
+    "\u0000\u0002H\u0001\u0000\u0000\u0000\u0002J\u0001\u0000\u0000\u0000\u0002"+
+    "L\u0001\u0000\u0000\u0000\u0002N\u0001\u0000\u0000\u0000\u0002P\u0001"+
+    "\u0000\u0000\u0000\u0002R\u0001\u0000\u0000\u0000\u0002T\u0001\u0000\u0000"+
+    "\u0000\u0002V\u0001\u0000\u0000\u0000\u0002X\u0001\u0000\u0000\u0000\u0002"+
+    "Z\u0001\u0000\u0000\u0000\u0002\\\u0001\u0000\u0000\u0000\u0002^\u0001"+
+    "\u0000\u0000\u0000\u0002`\u0001\u0000\u0000\u0000\u0002b\u0001\u0000\u0000"+
+    "\u0000\u0002d\u0001\u0000\u0000\u0000\u0002f\u0001\u0000\u0000\u0000\u0002"+
+    "h\u0001\u0000\u0000\u0000\u0002j\u0001\u0000\u0000\u0000\u0002l\u0001"+
+    "\u0000\u0000\u0000\u0002n\u0001\u0000\u0000\u0000\u0002p\u0001\u0000\u0000"+
+    "\u0000\u0002r\u0001\u0000\u0000\u0000\u0002t\u0001\u0000\u0000\u0000\u0002"+
+    "v\u0001\u0000\u0000\u0000\u0002x\u0001\u0000\u0000\u0000\u0002z\u0001"+
+    "\u0000\u0000\u0000\u0002|\u0001\u0000\u0000\u0000\u0002~\u0001\u0000\u0000"+
+    "\u0000\u0002\u0080\u0001\u0000\u0000\u0000\u0002\u0082\u0001\u0000\u0000"+
+    "\u0000\u0002\u0084\u0001\u0000\u0000\u0000\u0002\u0086\u0001\u0000\u0000"+
+    "\u0000\u0002\u0088\u0001\u0000\u0000\u0000\u0002\u008a\u0001\u0000\u0000"+
+    "\u0000\u0002\u008c\u0001\u0000\u0000\u0000\u0002\u008e\u0001\u0000\u0000"+
+    "\u0000\u0002\u0090\u0001\u0000\u0000\u0000\u0002\u0092\u0001\u0000\u0000"+
+    "\u0000\u0002\u0094\u0001\u0000\u0000\u0000\u0002\u0096\u0001\u0000\u0000"+
+    "\u0000\u0002\u0098\u0001\u0000\u0000\u0000\u0002\u009a\u0001\u0000\u0000"+
+    "\u0000\u0002\u009c\u0001\u0000\u0000\u0000\u0003\u009e\u0001\u0000\u0000"+
+    "\u0000\u0003\u00a0\u0001\u0000\u0000\u0000\u0003\u00a2\u0001\u0000\u0000"+
+    "\u0000\u0003\u00a4\u0001\u0000\u0000\u0000\u0003\u00a6\u0001\u0000\u0000"+
+    "\u0000\u0003\u00a8\u0001\u0000\u0000\u0000\u0003\u00aa\u0001\u0000\u0000"+
+    "\u0000\u0003\u00ac\u0001\u0000\u0000\u0000\u0003\u00ae\u0001\u0000\u0000"+
+    "\u0000\u0003\u00b0\u0001\u0000\u0000\u0000\u0003\u00b4\u0001\u0000\u0000"+
+    "\u0000\u0003\u00b6\u0001\u0000\u0000\u0000\u0003\u00b8\u0001\u0000\u0000"+
+    "\u0000\u0003\u00ba\u0001\u0000\u0000\u0000\u0004\u00bc\u0001\u0000\u0000"+
+    "\u0000\u0006\u00c6\u0001\u0000\u0000\u0000\b\u00cd\u0001\u0000\u0000\u0000"+
+    "\n\u00d6\u0001\u0000\u0000\u0000\f\u00dd\u0001\u0000\u0000\u0000\u000e"+
+    "\u00e7\u0001\u0000\u0000\u0000\u0010\u00ee\u0001\u0000\u0000\u0000\u0012"+
+    "\u00f5\u0001\u0000\u0000\u0000\u0014\u0103\u0001\u0000\u0000\u0000\u0016"+
+    "\u010a\u0001\u0000\u0000\u0000\u0018\u0112\u0001\u0000\u0000\u0000\u001a"+
+    "\u011e\u0001\u0000\u0000\u0000\u001c\u0128\u0001\u0000\u0000\u0000\u001e"+
+    "\u0131\u0001\u0000\u0000\u0000 \u0137\u0001\u0000\u0000\u0000\"\u013e"+
+    "\u0001\u0000\u0000\u0000$\u0145\u0001\u0000\u0000\u0000&\u014d\u0001\u0000"+
+    "\u0000\u0000(\u0156\u0001\u0000\u0000\u0000*\u015c\u0001\u0000\u0000\u0000"+
+    ",\u016d\u0001\u0000\u0000\u0000.\u017d\u0001\u0000\u0000\u00000\u0183"+
+    "\u0001\u0000\u0000\u00002\u0188\u0001\u0000\u0000\u00004\u018d\u0001\u0000"+
+    "\u0000\u00006\u0191\u0001\u0000\u0000\u00008\u0195\u0001\u0000\u0000\u0000"+
+    ":\u0199\u0001\u0000\u0000\u0000<\u019d\u0001\u0000\u0000\u0000>\u019f"+
+    "\u0001\u0000\u0000\u0000@\u01a1\u0001\u0000\u0000\u0000B\u01a4\u0001\u0000"+
+    "\u0000\u0000D\u01a6\u0001\u0000\u0000\u0000F\u01cc\u0001\u0000\u0000\u0000"+
+    "H\u01cf\u0001\u0000\u0000\u0000J\u01fd\u0001\u0000\u0000\u0000L\u01ff"+
+    "\u0001\u0000\u0000\u0000N\u0202\u0001\u0000\u0000\u0000P\u0206\u0001\u0000"+
+    "\u0000\u0000R\u020a\u0001\u0000\u0000\u0000T\u020c\u0001\u0000\u0000\u0000"+
+    "V\u020e\u0001\u0000\u0000\u0000X\u0213\u0001\u0000\u0000\u0000Z\u0215"+
+    "\u0001\u0000\u0000\u0000\\\u021b\u0001\u0000\u0000\u0000^\u0221\u0001"+
+    "\u0000\u0000\u0000`\u0226\u0001\u0000\u0000\u0000b\u0228\u0001\u0000\u0000"+
+    "\u0000d\u022b\u0001\u0000\u0000\u0000f\u0230\u0001\u0000\u0000\u0000h"+
+    "\u0234\u0001\u0000\u0000\u0000j\u0239\u0001\u0000\u0000\u0000l\u023f\u0001"+
+    "\u0000\u0000\u0000n\u0242\u0001\u0000\u0000\u0000p\u0244\u0001\u0000\u0000"+
+    "\u0000r\u024a\u0001\u0000\u0000\u0000t\u024c\u0001\u0000\u0000\u0000v"+
+    "\u0251\u0001\u0000\u0000\u0000x\u0256\u0001\u0000\u0000\u0000z\u0260\u0001"+
+    "\u0000\u0000\u0000|\u0263\u0001\u0000\u0000\u0000~\u0266\u0001\u0000\u0000"+
+    "\u0000\u0080\u0268\u0001\u0000\u0000\u0000\u0082\u026b\u0001\u0000\u0000"+
+    "\u0000\u0084\u026d\u0001\u0000\u0000\u0000\u0086\u0270\u0001\u0000\u0000"+
+    "\u0000\u0088\u0272\u0001\u0000\u0000\u0000\u008a\u0274\u0001\u0000\u0000"+
+    "\u0000\u008c\u0276\u0001\u0000\u0000\u0000\u008e\u0278\u0001\u0000\u0000"+
+    "\u0000\u0090\u027a\u0001\u0000\u0000\u0000\u0092\u027f\u0001\u0000\u0000"+
+    "\u0000\u0094\u0295\u0001\u0000\u0000\u0000\u0096\u0297\u0001\u0000\u0000"+
+    "\u0000\u0098\u02a2\u0001\u0000\u0000\u0000\u009a\u02a6\u0001\u0000\u0000"+
+    "\u0000\u009c\u02aa\u0001\u0000\u0000\u0000\u009e\u02ae\u0001\u0000\u0000"+
+    "\u0000\u00a0\u02b3\u0001\u0000\u0000\u0000\u00a2\u02b9\u0001\u0000\u0000"+
+    "\u0000\u00a4\u02bf\u0001\u0000\u0000\u0000\u00a6\u02c3\u0001\u0000\u0000"+
+    "\u0000\u00a8\u02c7\u0001\u0000\u0000\u0000\u00aa\u02ca\u0001\u0000\u0000"+
+    "\u0000\u00ac\u02d3\u0001\u0000\u0000\u0000\u00ae\u02d6\u0001\u0000\u0000"+
+    "\u0000\u00b0\u02dc\u0001\u0000\u0000\u0000\u00b2\u02e7\u0001\u0000\u0000"+
+    "\u0000\u00b4\u02e9\u0001\u0000\u0000\u0000\u00b6\u02eb\u0001\u0000\u0000"+
+    "\u0000\u00b8\u02ef\u0001\u0000\u0000\u0000\u00ba\u02f3\u0001\u0000\u0000"+
+    "\u0000\u00bc\u00bd\u0005d\u0000\u0000\u00bd\u00be\u0005i\u0000\u0000\u00be"+
+    "\u00bf\u0005s\u0000\u0000\u00bf\u00c0\u0005s\u0000\u0000\u00c0\u00c1\u0005"+
+    "e\u0000\u0000\u00c1\u00c2\u0005c\u0000\u0000\u00c2\u00c3\u0005t\u0000"+
+    "\u0000\u00c3\u00c4\u0001\u0000\u0000\u0000\u00c4\u00c5\u0006\u0000\u0000"+
+    "\u0000\u00c5\u0005\u0001\u0000\u0000\u0000\u00c6\u00c7\u0005d\u0000\u0000"+
+    "\u00c7\u00c8\u0005r\u0000\u0000\u00c8\u00c9\u0005o\u0000\u0000\u00c9\u00ca"+
+    "\u0005p\u0000\u0000\u00ca\u00cb\u0001\u0000\u0000\u0000\u00cb\u00cc\u0006"+
+    "\u0001\u0001\u0000\u00cc\u0007\u0001\u0000\u0000\u0000\u00cd\u00ce\u0005"+
+    "e\u0000\u0000\u00ce\u00cf\u0005n\u0000\u0000\u00cf\u00d0\u0005r\u0000"+
+    "\u0000\u00d0\u00d1\u0005i\u0000\u0000\u00d1\u00d2\u0005c\u0000\u0000\u00d2"+
+    "\u00d3\u0005h\u0000\u0000\u00d3\u00d4\u0001\u0000\u0000\u0000\u00d4\u00d5"+
+    "\u0006\u0002\u0001\u0000\u00d5\t\u0001\u0000\u0000\u0000\u00d6\u00d7\u0005"+
+    "e\u0000\u0000\u00d7\u00d8\u0005v\u0000\u0000\u00d8\u00d9\u0005a\u0000"+
+    "\u0000\u00d9\u00da\u0005l\u0000\u0000\u00da\u00db\u0001\u0000\u0000\u0000"+
+    "\u00db\u00dc\u0006\u0003\u0000\u0000\u00dc\u000b\u0001\u0000\u0000\u0000"+
+    "\u00dd\u00de\u0005e\u0000\u0000\u00de\u00df\u0005x\u0000\u0000\u00df\u00e0"+
+    "\u0005p\u0000\u0000\u00e0\u00e1\u0005l\u0000\u0000\u00e1\u00e2\u0005a"+
+    "\u0000\u0000\u00e2\u00e3\u0005i\u0000\u0000\u00e3\u00e4\u0005n\u0000\u0000"+
+    "\u00e4\u00e5\u0001\u0000\u0000\u0000\u00e5\u00e6\u0006\u0004\u0002\u0000"+
+    "\u00e6\r\u0001\u0000\u0000\u0000\u00e7\u00e8\u0005f\u0000\u0000\u00e8"+
+    "\u00e9\u0005r\u0000\u0000\u00e9\u00ea\u0005o\u0000\u0000\u00ea\u00eb\u0005"+
+    "m\u0000\u0000\u00eb\u00ec\u0001\u0000\u0000\u0000\u00ec\u00ed\u0006\u0005"+
+    "\u0001\u0000\u00ed\u000f\u0001\u0000\u0000\u0000\u00ee\u00ef\u0005g\u0000"+
+    "\u0000\u00ef\u00f0\u0005r\u0000\u0000\u00f0\u00f1\u0005o\u0000\u0000\u00f1"+
+    "\u00f2\u0005k\u0000\u0000\u00f2\u00f3\u0001\u0000\u0000\u0000\u00f3\u00f4"+
+    "\u0006\u0006\u0000\u0000\u00f4\u0011\u0001\u0000\u0000\u0000\u00f5\u00f6"+
+    "\u0005i\u0000\u0000\u00f6\u00f7\u0005n\u0000\u0000\u00f7\u00f8\u0005l"+
+    "\u0000\u0000\u00f8\u00f9\u0005i\u0000\u0000\u00f9\u00fa\u0005n\u0000\u0000"+
+    "\u00fa\u00fb\u0005e\u0000\u0000\u00fb\u00fc\u0005s\u0000\u0000\u00fc\u00fd"+
+    "\u0005t\u0000\u0000\u00fd\u00fe\u0005a\u0000\u0000\u00fe\u00ff\u0005t"+
+    "\u0000\u0000\u00ff\u0100\u0005s\u0000\u0000\u0100\u0101\u0001\u0000\u0000"+
+    "\u0000\u0101\u0102\u0006\u0007\u0000\u0000\u0102\u0013\u0001\u0000\u0000"+
+    "\u0000\u0103\u0104\u0005k\u0000\u0000\u0104\u0105\u0005e\u0000\u0000\u0105"+
+    "\u0106\u0005e\u0000\u0000\u0106\u0107\u0005p\u0000\u0000\u0107\u0108\u0001"+
+    "\u0000\u0000\u0000\u0108\u0109\u0006\b\u0001\u0000\u0109\u0015\u0001\u0000"+
+    "\u0000\u0000\u010a\u010b\u0005l\u0000\u0000\u010b\u010c\u0005i\u0000\u0000"+
+    "\u010c\u010d\u0005m\u0000\u0000\u010d\u010e\u0005i\u0000\u0000\u010e\u010f"+
+    "\u0005t\u0000\u0000\u010f\u0110\u0001\u0000\u0000\u0000\u0110\u0111\u0006"+
+    "\t\u0000\u0000\u0111\u0017\u0001\u0000\u0000\u0000\u0112\u0113\u0005m"+
+    "\u0000\u0000\u0113\u0114\u0005v\u0000\u0000\u0114\u0115\u0005_\u0000\u0000"+
+    "\u0115\u0116\u0005e\u0000\u0000\u0116\u0117\u0005x\u0000\u0000\u0117\u0118"+
+    "\u0005p\u0000\u0000\u0118\u0119\u0005a\u0000\u0000\u0119\u011a\u0005n"+
+    "\u0000\u0000\u011a\u011b\u0005d\u0000\u0000\u011b\u011c\u0001\u0000\u0000"+
+    "\u0000\u011c\u011d\u0006\n\u0001\u0000\u011d\u0019\u0001\u0000\u0000\u0000"+
+    "\u011e\u011f\u0005p\u0000\u0000\u011f\u0120\u0005r\u0000\u0000\u0120\u0121"+
+    "\u0005o\u0000\u0000\u0121\u0122\u0005j\u0000\u0000\u0122\u0123\u0005e"+
+    "\u0000\u0000\u0123\u0124\u0005c\u0000\u0000\u0124\u0125\u0005t\u0000\u0000"+
+    "\u0125\u0126\u0001\u0000\u0000\u0000\u0126\u0127\u0006\u000b\u0001\u0000"+
+    "\u0127\u001b\u0001\u0000\u0000\u0000\u0128\u0129\u0005r\u0000\u0000\u0129"+
+    "\u012a\u0005e\u0000\u0000\u012a\u012b\u0005n\u0000\u0000\u012b\u012c\u0005"+
+    "a\u0000\u0000\u012c\u012d\u0005m\u0000\u0000\u012d\u012e\u0005e\u0000"+
+    "\u0000\u012e\u012f\u0001\u0000\u0000\u0000\u012f\u0130\u0006\f\u0001\u0000"+
+    "\u0130\u001d\u0001\u0000\u0000\u0000\u0131\u0132\u0005r\u0000\u0000\u0132"+
+    "\u0133\u0005o\u0000\u0000\u0133\u0134\u0005w\u0000\u0000\u0134\u0135\u0001"+
+    "\u0000\u0000\u0000\u0135\u0136\u0006\r\u0000\u0000\u0136\u001f\u0001\u0000"+
+    "\u0000\u0000\u0137\u0138\u0005s\u0000\u0000\u0138\u0139\u0005h\u0000\u0000"+
+    "\u0139\u013a\u0005o\u0000\u0000\u013a\u013b\u0005w\u0000\u0000\u013b\u013c"+
+    "\u0001\u0000\u0000\u0000\u013c\u013d\u0006\u000e\u0000\u0000\u013d!\u0001"+
+    "\u0000\u0000\u0000\u013e\u013f\u0005s\u0000\u0000\u013f\u0140\u0005o\u0000"+
+    "\u0000\u0140\u0141\u0005r\u0000\u0000\u0141\u0142\u0005t\u0000\u0000\u0142"+
+    "\u0143\u0001\u0000\u0000\u0000\u0143\u0144\u0006\u000f\u0000\u0000\u0144"+
+    "#\u0001\u0000\u0000\u0000\u0145\u0146\u0005s\u0000\u0000\u0146\u0147\u0005"+
+    "t\u0000\u0000\u0147\u0148\u0005a\u0000\u0000\u0148\u0149\u0005t\u0000"+
+    "\u0000\u0149\u014a\u0005s\u0000\u0000\u014a\u014b\u0001\u0000\u0000\u0000"+
+    "\u014b\u014c\u0006\u0010\u0000\u0000\u014c%\u0001\u0000\u0000\u0000\u014d"+
+    "\u014e\u0005w\u0000\u0000\u014e\u014f\u0005h\u0000\u0000\u014f\u0150\u0005"+
+    "e\u0000\u0000\u0150\u0151\u0005r\u0000\u0000\u0151\u0152\u0005e\u0000"+
+    "\u0000\u0152\u0153\u0001\u0000\u0000\u0000\u0153\u0154\u0006\u0011\u0000"+
+    "\u0000\u0154\'\u0001\u0000\u0000\u0000\u0155\u0157\b\u0000\u0000\u0000"+
+    "\u0156\u0155\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000"+
+    "\u0158\u0156\u0001\u0000\u0000\u0000\u0158\u0159\u0001\u0000\u0000\u0000"+
+    "\u0159\u015a\u0001\u0000\u0000\u0000\u015a\u015b\u0006\u0012\u0000\u0000"+
+    "\u015b)\u0001\u0000\u0000\u0000\u015c\u015d\u0005/\u0000\u0000\u015d\u015e"+
+    "\u0005/\u0000\u0000\u015e\u0162\u0001\u0000\u0000\u0000\u015f\u0161\b"+
+    "\u0001\u0000\u0000\u0160\u015f\u0001\u0000\u0000\u0000\u0161\u0164\u0001"+
+    "\u0000\u0000\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0163\u0001"+
+    "\u0000\u0000\u0000\u0163\u0166\u0001\u0000\u0000\u0000\u0164\u0162\u0001"+
+    "\u0000\u0000\u0000\u0165\u0167\u0005\r\u0000\u0000\u0166\u0165\u0001\u0000"+
+    "\u0000\u0000\u0166\u0167\u0001\u0000\u0000\u0000\u0167\u0169\u0001\u0000"+
+    "\u0000\u0000\u0168\u016a\u0005\n\u0000\u0000\u0169\u0168\u0001\u0000\u0000"+
+    "\u0000\u0169\u016a\u0001\u0000\u0000\u0000\u016a\u016b\u0001\u0000\u0000"+
+    "\u0000\u016b\u016c\u0006\u0013\u0003\u0000\u016c+\u0001\u0000\u0000\u0000"+
+    "\u016d\u016e\u0005/\u0000\u0000\u016e\u016f\u0005*\u0000\u0000\u016f\u0174"+
+    "\u0001\u0000\u0000\u0000\u0170\u0173\u0003,\u0014\u0000\u0171\u0173\t"+
+    "\u0000\u0000\u0000\u0172\u0170\u0001\u0000\u0000\u0000\u0172\u0171\u0001"+
+    "\u0000\u0000\u0000\u0173\u0176\u0001\u0000\u0000\u0000\u0174\u0175\u0001"+
+    "\u0000\u0000\u0000\u0174\u0172\u0001\u0000\u0000\u0000\u0175\u0177\u0001"+
+    "\u0000\u0000\u0000\u0176\u0174\u0001\u0000\u0000\u0000\u0177\u0178\u0005"+
+    "*\u0000\u0000\u0178\u0179\u0005/\u0000\u0000\u0179\u017a\u0001\u0000\u0000"+
+    "\u0000\u017a\u017b\u0006\u0014\u0003\u0000\u017b-\u0001\u0000\u0000\u0000"+
+    "\u017c\u017e\u0007\u0002\u0000\u0000\u017d\u017c\u0001\u0000\u0000\u0000"+
+    "\u017e\u017f\u0001\u0000\u0000\u0000\u017f\u017d\u0001\u0000\u0000\u0000"+
+    "\u017f\u0180\u0001\u0000\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000"+
+    "\u0181\u0182\u0006\u0015\u0003\u0000\u0182/\u0001\u0000\u0000\u0000\u0183"+
+    "\u0184\u0005[\u0000\u0000\u0184\u0185\u0001\u0000\u0000\u0000\u0185\u0186"+
+    "\u0006\u0016\u0004\u0000\u0186\u0187\u0006\u0016\u0005\u0000\u01871\u0001"+
+    "\u0000\u0000\u0000\u0188\u0189\u0005|\u0000\u0000\u0189\u018a\u0001\u0000"+
+    "\u0000\u0000\u018a\u018b\u0006\u0017\u0006\u0000\u018b\u018c\u0006\u0017"+
+    "\u0007\u0000\u018c3\u0001\u0000\u0000\u0000\u018d\u018e\u0003.\u0015\u0000"+
+    "\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u0190\u0006\u0018\u0003\u0000"+
+    "\u01905\u0001\u0000\u0000\u0000\u0191\u0192\u0003*\u0013\u0000\u0192\u0193"+
+    "\u0001\u0000\u0000\u0000\u0193\u0194\u0006\u0019\u0003\u0000\u01947\u0001"+
+    "\u0000\u0000\u0000\u0195\u0196\u0003,\u0014\u0000\u0196\u0197\u0001\u0000"+
+    "\u0000\u0000\u0197\u0198\u0006\u001a\u0003\u0000\u01989\u0001\u0000\u0000"+
+    "\u0000\u0199\u019a\u0005|\u0000\u0000\u019a\u019b\u0001\u0000\u0000\u0000"+
+    "\u019b\u019c\u0006\u001b\u0007\u0000\u019c;\u0001\u0000\u0000\u0000\u019d"+
+    "\u019e\u0007\u0003\u0000\u0000\u019e=\u0001\u0000\u0000\u0000\u019f\u01a0"+
+    "\u0007\u0004\u0000\u0000\u01a0?\u0001\u0000\u0000\u0000\u01a1\u01a2\u0005"+
+    "\\\u0000\u0000\u01a2\u01a3\u0007\u0005\u0000\u0000\u01a3A\u0001\u0000"+
+    "\u0000\u0000\u01a4\u01a5\b\u0006\u0000\u0000\u01a5C\u0001\u0000\u0000"+
+    "\u0000\u01a6\u01a8\u0007\u0007\u0000\u0000\u01a7\u01a9\u0007\b\u0000\u0000"+
+    "\u01a8\u01a7\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001\u0000\u0000\u0000"+
+    "\u01a9\u01ab\u0001\u0000\u0000\u0000\u01aa\u01ac\u0003<\u001c\u0000\u01ab"+
+    "\u01aa\u0001\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad"+
+    "\u01ab\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae"+
+    "E\u0001\u0000\u0000\u0000\u01af\u01b4\u0005\"\u0000\u0000\u01b0\u01b3"+
+    "\u0003@\u001e\u0000\u01b1\u01b3\u0003B\u001f\u0000\u01b2\u01b0\u0001\u0000"+
+    "\u0000\u0000\u01b2\u01b1\u0001\u0000\u0000\u0000\u01b3\u01b6\u0001\u0000"+
+    "\u0000\u0000\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b4\u01b5\u0001\u0000"+
+    "\u0000\u0000\u01b5\u01b7\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000"+
+    "\u0000\u0000\u01b7\u01cd\u0005\"\u0000\u0000\u01b8\u01b9\u0005\"\u0000"+
+    "\u0000\u01b9\u01ba\u0005\"\u0000\u0000\u01ba\u01bb\u0005\"\u0000\u0000"+
+    "\u01bb\u01bf\u0001\u0000\u0000\u0000\u01bc\u01be\b\u0001\u0000\u0000\u01bd"+
+    "\u01bc\u0001\u0000\u0000\u0000\u01be\u01c1\u0001\u0000\u0000\u0000\u01bf"+
     "\u01c0\u0001\u0000\u0000\u0000\u01bf\u01bd\u0001\u0000\u0000\u0000\u01c0"+
-    "\u01c1\u0005\"\u0000\u0000\u01c1\u01c2\u0005\"\u0000\u0000\u01c2\u01c3"+
-    "\u0005\"\u0000\u0000\u01c3\u01c5\u0001\u0000\u0000\u0000\u01c4\u01c6\u0005"+
-    "\"\u0000\u0000\u01c5\u01c4\u0001\u0000\u0000\u0000\u01c5\u01c6\u0001\u0000"+
-    "\u0000\u0000\u01c6\u01c8\u0001\u0000\u0000\u0000\u01c7\u01c9\u0005\"\u0000"+
-    "\u0000\u01c8\u01c7\u0001\u0000\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000"+
-    "\u0000\u01c9\u01cb\u0001\u0000\u0000\u0000\u01ca\u01ad\u0001\u0000\u0000"+
-    "\u0000\u01ca\u01b6\u0001\u0000\u0000\u0000\u01cbG\u0001\u0000\u0000\u0000"+
-    "\u01cc\u01ce\u0003<\u001c\u0000\u01cd\u01cc\u0001\u0000\u0000\u0000\u01ce"+
-    "\u01cf\u0001\u0000\u0000\u0000\u01cf\u01cd\u0001\u0000\u0000\u0000\u01cf"+
-    "\u01d0\u0001\u0000\u0000\u0000\u01d0I\u0001\u0000\u0000\u0000\u01d1\u01d3"+
-    "\u0003<\u001c\u0000\u01d2\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+
-    "\u0000\u0000\u0000\u01d4\u01d2\u0001\u0000\u0000\u0000\u01d4\u01d5\u0001"+
-    "\u0000\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01da\u0003"+
-    "X*\u0000\u01d7\u01d9\u0003<\u001c\u0000\u01d8\u01d7\u0001\u0000\u0000"+
-    "\u0000\u01d9\u01dc\u0001\u0000\u0000\u0000\u01da\u01d8\u0001\u0000\u0000"+
-    "\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01db\u01fc\u0001\u0000\u0000"+
-    "\u0000\u01dc\u01da\u0001\u0000\u0000\u0000\u01dd\u01df\u0003X*\u0000\u01de"+
-    "\u01e0\u0003<\u001c\u0000\u01df\u01de\u0001\u0000\u0000\u0000\u01e0\u01e1"+
-    "\u0001\u0000\u0000\u0000\u01e1\u01df\u0001\u0000\u0000\u0000\u01e1\u01e2"+
-    "\u0001\u0000\u0000\u0000\u01e2\u01fc\u0001\u0000\u0000\u0000\u01e3\u01e5"+
-    "\u0003<\u001c\u0000\u01e4\u01e3\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001"+
-    "\u0000\u0000\u0000\u01e6\u01e4\u0001\u0000\u0000\u0000\u01e6\u01e7\u0001"+
-    "\u0000\u0000\u0000\u01e7\u01ef\u0001\u0000\u0000\u0000\u01e8\u01ec\u0003"+
-    "X*\u0000\u01e9\u01eb\u0003<\u001c\u0000\u01ea\u01e9\u0001\u0000\u0000"+
-    "\u0000\u01eb\u01ee\u0001\u0000\u0000\u0000\u01ec\u01ea\u0001\u0000\u0000"+
-    "\u0000\u01ec\u01ed\u0001\u0000\u0000\u0000\u01ed\u01f0\u0001\u0000\u0000"+
-    "\u0000\u01ee\u01ec\u0001\u0000\u0000\u0000\u01ef\u01e8\u0001\u0000\u0000"+
-    "\u0000\u01ef\u01f0\u0001\u0000\u0000\u0000\u01f0\u01f1\u0001\u0000\u0000"+
-    "\u0000\u01f1\u01f2\u0003D \u0000\u01f2\u01fc\u0001\u0000\u0000\u0000\u01f3"+
-    "\u01f5\u0003X*\u0000\u01f4\u01f6\u0003<\u001c\u0000\u01f5\u01f4\u0001"+
-    "\u0000\u0000\u0000\u01f6\u01f7\u0001\u0000\u0000\u0000\u01f7\u01f5\u0001"+
-    "\u0000\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8\u01f9\u0001"+
-    "\u0000\u0000\u0000\u01f9\u01fa\u0003D \u0000\u01fa\u01fc\u0001\u0000\u0000"+
-    "\u0000\u01fb\u01d2\u0001\u0000\u0000\u0000\u01fb\u01dd\u0001\u0000\u0000"+
-    "\u0000\u01fb\u01e4\u0001\u0000\u0000\u0000\u01fb\u01f3\u0001\u0000\u0000"+
-    "\u0000\u01fcK\u0001\u0000\u0000\u0000\u01fd\u01fe\u0005b\u0000\u0000\u01fe"+
-    "\u01ff\u0005y\u0000\u0000\u01ffM\u0001\u0000\u0000\u0000\u0200\u0201\u0005"+
-    "a\u0000\u0000\u0201\u0202\u0005n\u0000\u0000\u0202\u0203\u0005d\u0000"+
-    "\u0000\u0203O\u0001\u0000\u0000\u0000\u0204\u0205\u0005a\u0000\u0000\u0205"+
-    "\u0206\u0005s\u0000\u0000\u0206\u0207\u0005c\u0000\u0000\u0207Q\u0001"+
-    "\u0000\u0000\u0000\u0208\u0209\u0005=\u0000\u0000\u0209S\u0001\u0000\u0000"+
-    "\u0000\u020a\u020b\u0005,\u0000\u0000\u020bU\u0001\u0000\u0000\u0000\u020c"+
-    "\u020d\u0005d\u0000\u0000\u020d\u020e\u0005e\u0000\u0000\u020e\u020f\u0005"+
-    "s\u0000\u0000\u020f\u0210\u0005c\u0000\u0000\u0210W\u0001\u0000\u0000"+
-    "\u0000\u0211\u0212\u0005.\u0000\u0000\u0212Y\u0001\u0000\u0000\u0000\u0213"+
-    "\u0214\u0005f\u0000\u0000\u0214\u0215\u0005a\u0000\u0000\u0215\u0216\u0005"+
-    "l\u0000\u0000\u0216\u0217\u0005s\u0000\u0000\u0217\u0218\u0005e\u0000"+
-    "\u0000\u0218[\u0001\u0000\u0000\u0000\u0219\u021a\u0005f\u0000\u0000\u021a"+
-    "\u021b\u0005i\u0000\u0000\u021b\u021c\u0005r\u0000\u0000\u021c\u021d\u0005"+
-    "s\u0000\u0000\u021d\u021e\u0005t\u0000\u0000\u021e]\u0001\u0000\u0000"+
-    "\u0000\u021f\u0220\u0005l\u0000\u0000\u0220\u0221\u0005a\u0000\u0000\u0221"+
-    "\u0222\u0005s\u0000\u0000\u0222\u0223\u0005t\u0000\u0000\u0223_\u0001"+
-    "\u0000\u0000\u0000\u0224\u0225\u0005(\u0000\u0000\u0225a\u0001\u0000\u0000"+
-    "\u0000\u0226\u0227\u0005i\u0000\u0000\u0227\u0228\u0005n\u0000\u0000\u0228"+
-    "c\u0001\u0000\u0000\u0000\u0229\u022a\u0005l\u0000\u0000\u022a\u022b\u0005"+
-    "i\u0000\u0000\u022b\u022c\u0005k\u0000\u0000\u022c\u022d\u0005e\u0000"+
-    "\u0000\u022de\u0001\u0000\u0000\u0000\u022e\u022f\u0005n\u0000\u0000\u022f"+
-    "\u0230\u0005o\u0000\u0000\u0230\u0231\u0005t\u0000\u0000\u0231g\u0001"+
-    "\u0000\u0000\u0000\u0232\u0233\u0005n\u0000\u0000\u0233\u0234\u0005u\u0000"+
-    "\u0000\u0234\u0235\u0005l\u0000\u0000\u0235\u0236\u0005l\u0000\u0000\u0236"+
-    "i\u0001\u0000\u0000\u0000\u0237\u0238\u0005n\u0000\u0000\u0238\u0239\u0005"+
-    "u\u0000\u0000\u0239\u023a\u0005l\u0000\u0000\u023a\u023b\u0005l\u0000"+
-    "\u0000\u023b\u023c\u0005s\u0000\u0000\u023ck\u0001\u0000\u0000\u0000\u023d"+
-    "\u023e\u0005o\u0000\u0000\u023e\u023f\u0005r\u0000\u0000\u023fm\u0001"+
-    "\u0000\u0000\u0000\u0240\u0241\u0005?\u0000\u0000\u0241o\u0001\u0000\u0000"+
-    "\u0000\u0242\u0243\u0005r\u0000\u0000\u0243\u0244\u0005l\u0000\u0000\u0244"+
-    "\u0245\u0005i\u0000\u0000\u0245\u0246\u0005k\u0000\u0000\u0246\u0247\u0005"+
-    "e\u0000\u0000\u0247q\u0001\u0000\u0000\u0000\u0248\u0249\u0005)\u0000"+
-    "\u0000\u0249s\u0001\u0000\u0000\u0000\u024a\u024b\u0005t\u0000\u0000\u024b"+
-    "\u024c\u0005r\u0000\u0000\u024c\u024d\u0005u\u0000\u0000\u024d\u024e\u0005"+
-    "e\u0000\u0000\u024eu\u0001\u0000\u0000\u0000\u024f\u0250\u0005i\u0000"+
-    "\u0000\u0250\u0251\u0005n\u0000\u0000\u0251\u0252\u0005f\u0000\u0000\u0252"+
-    "\u0253\u0005o\u0000\u0000\u0253w\u0001\u0000\u0000\u0000\u0254\u0255\u0005"+
-    "f\u0000\u0000\u0255\u0256\u0005u\u0000\u0000\u0256\u0257\u0005n\u0000"+
-    "\u0000\u0257\u0258\u0005c\u0000\u0000\u0258\u0259\u0005t\u0000\u0000\u0259"+
-    "\u025a\u0005i\u0000\u0000\u025a\u025b\u0005o\u0000\u0000\u025b\u025c\u0005"+
-    "n\u0000\u0000\u025c\u025d\u0005s\u0000\u0000\u025dy\u0001\u0000\u0000"+
-    "\u0000\u025e\u025f\u0005=\u0000\u0000\u025f\u0260\u0005=\u0000\u0000\u0260"+
-    "{\u0001\u0000\u0000\u0000\u0261\u0262\u0005!\u0000\u0000\u0262\u0263\u0005"+
-    "=\u0000\u0000\u0263}\u0001\u0000\u0000\u0000\u0264\u0265\u0005<\u0000"+
-    "\u0000\u0265\u007f\u0001\u0000\u0000\u0000\u0266\u0267\u0005<\u0000\u0000"+
-    "\u0267\u0268\u0005=\u0000\u0000\u0268\u0081\u0001\u0000\u0000\u0000\u0269"+
-    "\u026a\u0005>\u0000\u0000\u026a\u0083\u0001\u0000\u0000\u0000\u026b\u026c"+
-    "\u0005>\u0000\u0000\u026c\u026d\u0005=\u0000\u0000\u026d\u0085\u0001\u0000"+
-    "\u0000\u0000\u026e\u026f\u0005+\u0000\u0000\u026f\u0087\u0001\u0000\u0000"+
-    "\u0000\u0270\u0271\u0005-\u0000\u0000\u0271\u0089\u0001\u0000\u0000\u0000"+
-    "\u0272\u0273\u0005*\u0000\u0000\u0273\u008b\u0001\u0000\u0000\u0000\u0274"+
-    "\u0275\u0005/\u0000\u0000\u0275\u008d\u0001\u0000\u0000\u0000\u0276\u0277"+
-    "\u0005%\u0000\u0000\u0277\u008f\u0001\u0000\u0000\u0000\u0278\u0279\u0005"+
-    "[\u0000\u0000\u0279\u027a\u0001\u0000\u0000\u0000\u027a\u027b\u0006F\u0000"+
-    "\u0000\u027b\u027c\u0006F\u0000\u0000\u027c\u0091\u0001\u0000\u0000\u0000"+
-    "\u027d\u027e\u0005]\u0000\u0000\u027e\u027f\u0001\u0000\u0000\u0000\u027f"+
-    "\u0280\u0006G\u0007\u0000\u0280\u0281\u0006G\u0007\u0000\u0281\u0093\u0001"+
-    "\u0000\u0000\u0000\u0282\u0288\u0003>\u001d\u0000\u0283\u0287\u0003>\u001d"+
-    "\u0000\u0284\u0287\u0003<\u001c\u0000\u0285\u0287\u0005_\u0000\u0000\u0286"+
-    "\u0283\u0001\u0000\u0000\u0000\u0286\u0284\u0001\u0000\u0000\u0000\u0286"+
-    "\u0285\u0001\u0000\u0000\u0000\u0287\u028a\u0001\u0000\u0000\u0000\u0288"+
-    "\u0286\u0001\u0000\u0000\u0000\u0288\u0289\u0001\u0000\u0000\u0000\u0289"+
-    "\u0294\u0001\u0000\u0000\u0000\u028a\u0288\u0001\u0000\u0000\u0000\u028b"+
-    "\u028f\u0007\t\u0000\u0000\u028c\u0290\u0003>\u001d\u0000\u028d\u0290"+
-    "\u0003<\u001c\u0000\u028e\u0290\u0005_\u0000\u0000\u028f\u028c\u0001\u0000"+
-    "\u0000\u0000\u028f\u028d\u0001\u0000\u0000\u0000\u028f\u028e\u0001\u0000"+
-    "\u0000\u0000\u0290\u0291\u0001\u0000\u0000\u0000\u0291\u028f\u0001\u0000"+
-    "\u0000\u0000\u0291\u0292\u0001\u0000\u0000\u0000\u0292\u0294\u0001\u0000"+
-    "\u0000\u0000\u0293\u0282\u0001\u0000\u0000\u0000\u0293\u028b\u0001\u0000"+
-    "\u0000\u0000\u0294\u0095\u0001\u0000\u0000\u0000\u0295\u029b\u0005`\u0000"+
-    "\u0000\u0296\u029a\b\n\u0000\u0000\u0297\u0298\u0005`\u0000\u0000\u0298"+
-    "\u029a\u0005`\u0000\u0000\u0299\u0296\u0001\u0000\u0000\u0000\u0299\u0297"+
-    "\u0001\u0000\u0000\u0000\u029a\u029d\u0001\u0000\u0000\u0000\u029b\u0299"+
-    "\u0001\u0000\u0000\u0000\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u029e"+
-    "\u0001\u0000\u0000\u0000\u029d\u029b\u0001\u0000\u0000\u0000\u029e\u029f"+
-    "\u0005`\u0000\u0000\u029f\u0097\u0001\u0000\u0000\u0000\u02a0\u02a1\u0003"+
-    "*\u0013\u0000\u02a1\u02a2\u0001\u0000\u0000\u0000\u02a2\u02a3\u0006J\u0003"+
-    "\u0000\u02a3\u0099\u0001\u0000\u0000\u0000\u02a4\u02a5\u0003,\u0014\u0000"+
-    "\u02a5\u02a6\u0001\u0000\u0000\u0000\u02a6\u02a7\u0006K\u0003\u0000\u02a7"+
-    "\u009b\u0001\u0000\u0000\u0000\u02a8\u02a9\u0003.\u0015\u0000\u02a9\u02aa"+
-    "\u0001\u0000\u0000\u0000\u02aa\u02ab\u0006L\u0003\u0000\u02ab\u009d\u0001"+
-    "\u0000\u0000\u0000\u02ac\u02ad\u0005|\u0000\u0000\u02ad\u02ae\u0001\u0000"+
-    "\u0000\u0000\u02ae\u02af\u0006M\u0006\u0000\u02af\u02b0\u0006M\u0007\u0000"+
-    "\u02b0\u009f\u0001\u0000\u0000\u0000\u02b1\u02b2\u0005[\u0000\u0000\u02b2"+
-    "\u02b3\u0001\u0000\u0000\u0000\u02b3\u02b4\u0006N\u0004\u0000\u02b4\u02b5"+
-    "\u0006N\u0001\u0000\u02b5\u02b6\u0006N\u0001\u0000\u02b6\u00a1\u0001\u0000"+
-    "\u0000\u0000\u02b7\u02b8\u0005]\u0000\u0000\u02b8\u02b9\u0001\u0000\u0000"+
-    "\u0000\u02b9\u02ba\u0006O\u0007\u0000\u02ba\u02bb\u0006O\u0007\u0000\u02bb"+
-    "\u02bc\u0006O\b\u0000\u02bc\u00a3\u0001\u0000\u0000\u0000\u02bd\u02be"+
-    "\u0005,\u0000\u0000\u02be\u02bf\u0001\u0000\u0000\u0000\u02bf\u02c0\u0006"+
-    "P\t\u0000\u02c0\u00a5\u0001\u0000\u0000\u0000\u02c1\u02c2\u0005=\u0000"+
-    "\u0000\u02c2\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c4\u0006Q\n\u0000"+
-    "\u02c4\u00a7\u0001\u0000\u0000\u0000\u02c5\u02c6\u0005m\u0000\u0000\u02c6"+
-    "\u02c7\u0005e\u0000\u0000\u02c7\u02c8\u0005t\u0000\u0000\u02c8\u02c9\u0005"+
-    "a\u0000\u0000\u02c9\u02ca\u0005d\u0000\u0000\u02ca\u02cb\u0005a\u0000"+
-    "\u0000\u02cb\u02cc\u0005t\u0000\u0000\u02cc\u02cd\u0005a\u0000\u0000\u02cd"+
-    "\u00a9\u0001\u0000\u0000\u0000\u02ce\u02cf\u0005o\u0000\u0000\u02cf\u02d0"+
-    "\u0005n\u0000\u0000\u02d0\u00ab\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005"+
-    "w\u0000\u0000\u02d2\u02d3\u0005i\u0000\u0000\u02d3\u02d4\u0005t\u0000"+
-    "\u0000\u02d4\u02d5\u0005h\u0000\u0000\u02d5\u00ad\u0001\u0000\u0000\u0000"+
-    "\u02d6\u02d8\u0003\u00b0V\u0000\u02d7\u02d6\u0001\u0000\u0000\u0000\u02d8"+
-    "\u02d9\u0001\u0000\u0000\u0000\u02d9\u02d7\u0001\u0000\u0000\u0000\u02d9"+
-    "\u02da\u0001\u0000\u0000\u0000\u02da\u00af\u0001\u0000\u0000\u0000\u02db"+
-    "\u02dd\b\u000b\u0000\u0000\u02dc\u02db\u0001\u0000\u0000\u0000\u02dd\u02de"+
-    "\u0001\u0000\u0000\u0000\u02de\u02dc\u0001\u0000\u0000\u0000\u02de\u02df"+
-    "\u0001\u0000\u0000\u0000\u02df\u02e3\u0001\u0000\u0000\u0000\u02e0\u02e1"+
-    "\u0005/\u0000\u0000\u02e1\u02e3\b\f\u0000\u0000\u02e2\u02dc\u0001\u0000"+
-    "\u0000\u0000\u02e2\u02e0\u0001\u0000\u0000\u0000\u02e3\u00b1\u0001\u0000"+
-    "\u0000\u0000\u02e4\u02e5\u0003\u0096I\u0000\u02e5\u00b3\u0001\u0000\u0000"+
-    "\u0000\u02e6\u02e7\u0003*\u0013\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000"+
-    "\u02e8\u02e9\u0006X\u0003\u0000\u02e9\u00b5\u0001\u0000\u0000\u0000\u02ea"+
-    "\u02eb\u0003,\u0014\u0000\u02eb\u02ec\u0001\u0000\u0000\u0000\u02ec\u02ed"+
-    "\u0006Y\u0003\u0000\u02ed\u00b7\u0001\u0000\u0000\u0000\u02ee\u02ef\u0003"+
-    ".\u0015\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1\u0006Z\u0003"+
-    "\u0000\u02f1\u00b9\u0001\u0000\u0000\u0000&\u0000\u0001\u0002\u0003\u0156"+
-    "\u0160\u0164\u0167\u0170\u0172\u017d\u01a6\u01ab\u01b0\u01b2\u01bd\u01c5"+
-    "\u01c8\u01ca\u01cf\u01d4\u01da\u01e1\u01e6\u01ec\u01ef\u01f7\u01fb\u0286"+
-    "\u0288\u028f\u0291\u0293\u0299\u029b\u02d9\u02de\u02e2\u000b\u0005\u0002"+
-    "\u0000\u0005\u0003\u0000\u0005\u0001\u0000\u0000\u0001\u0000\u0007@\u0000"+
-    "\u0005\u0000\u0000\u0007\u001a\u0000\u0004\u0000\u0000\u0007A\u0000\u0007"+
-    "\"\u0000\u0007!\u0000";
+    "\u01c2\u0001\u0000\u0000\u0000\u01c1\u01bf\u0001\u0000\u0000\u0000\u01c2"+
+    "\u01c3\u0005\"\u0000\u0000\u01c3\u01c4\u0005\"\u0000\u0000\u01c4\u01c5"+
+    "\u0005\"\u0000\u0000\u01c5\u01c7\u0001\u0000\u0000\u0000\u01c6\u01c8\u0005"+
+    "\"\u0000\u0000\u01c7\u01c6\u0001\u0000\u0000\u0000\u01c7\u01c8\u0001\u0000"+
+    "\u0000\u0000\u01c8\u01ca\u0001\u0000\u0000\u0000\u01c9\u01cb\u0005\"\u0000"+
+    "\u0000\u01ca\u01c9\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000"+
+    "\u0000\u01cb\u01cd\u0001\u0000\u0000\u0000\u01cc\u01af\u0001\u0000\u0000"+
+    "\u0000\u01cc\u01b8\u0001\u0000\u0000\u0000\u01cdG\u0001\u0000\u0000\u0000"+
+    "\u01ce\u01d0\u0003<\u001c\u0000\u01cf\u01ce\u0001\u0000\u0000\u0000\u01d0"+
+    "\u01d1\u0001\u0000\u0000\u0000\u01d1\u01cf\u0001\u0000\u0000\u0000\u01d1"+
+    "\u01d2\u0001\u0000\u0000\u0000\u01d2I\u0001\u0000\u0000\u0000\u01d3\u01d5"+
+    "\u0003<\u001c\u0000\u01d4\u01d3\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001"+
+    "\u0000\u0000\u0000\u01d6\u01d4\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001"+
+    "\u0000\u0000\u0000\u01d7\u01d8\u0001\u0000\u0000\u0000\u01d8\u01dc\u0003"+
+    "X*\u0000\u01d9\u01db\u0003<\u001c\u0000\u01da\u01d9\u0001\u0000\u0000"+
+    "\u0000\u01db\u01de\u0001\u0000\u0000\u0000\u01dc\u01da\u0001\u0000\u0000"+
+    "\u0000\u01dc\u01dd\u0001\u0000\u0000\u0000\u01dd\u01fe\u0001\u0000\u0000"+
+    "\u0000\u01de\u01dc\u0001\u0000\u0000\u0000\u01df\u01e1\u0003X*\u0000\u01e0"+
+    "\u01e2\u0003<\u001c\u0000\u01e1\u01e0\u0001\u0000\u0000\u0000\u01e2\u01e3"+
+    "\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e4"+
+    "\u0001\u0000\u0000\u0000\u01e4\u01fe\u0001\u0000\u0000\u0000\u01e5\u01e7"+
+    "\u0003<\u001c\u0000\u01e6\u01e5\u0001\u0000\u0000\u0000\u01e7\u01e8\u0001"+
+    "\u0000\u0000\u0000\u01e8\u01e6\u0001\u0000\u0000\u0000\u01e8\u01e9\u0001"+
+    "\u0000\u0000\u0000\u01e9\u01f1\u0001\u0000\u0000\u0000\u01ea\u01ee\u0003"+
+    "X*\u0000\u01eb\u01ed\u0003<\u001c\u0000\u01ec\u01eb\u0001\u0000\u0000"+
+    "\u0000\u01ed\u01f0\u0001\u0000\u0000\u0000\u01ee\u01ec\u0001\u0000\u0000"+
+    "\u0000\u01ee\u01ef\u0001\u0000\u0000\u0000\u01ef\u01f2\u0001\u0000\u0000"+
+    "\u0000\u01f0\u01ee\u0001\u0000\u0000\u0000\u01f1\u01ea\u0001\u0000\u0000"+
+    "\u0000\u01f1\u01f2\u0001\u0000\u0000\u0000\u01f2\u01f3\u0001\u0000\u0000"+
+    "\u0000\u01f3\u01f4\u0003D \u0000\u01f4\u01fe\u0001\u0000\u0000\u0000\u01f5"+
+    "\u01f7\u0003X*\u0000\u01f6\u01f8\u0003<\u001c\u0000\u01f7\u01f6\u0001"+
+    "\u0000\u0000\u0000\u01f8\u01f9\u0001\u0000\u0000\u0000\u01f9\u01f7\u0001"+
+    "\u0000\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001"+
+    "\u0000\u0000\u0000\u01fb\u01fc\u0003D \u0000\u01fc\u01fe\u0001\u0000\u0000"+
+    "\u0000\u01fd\u01d4\u0001\u0000\u0000\u0000\u01fd\u01df\u0001\u0000\u0000"+
+    "\u0000\u01fd\u01e6\u0001\u0000\u0000\u0000\u01fd\u01f5\u0001\u0000\u0000"+
+    "\u0000\u01feK\u0001\u0000\u0000\u0000\u01ff\u0200\u0005b\u0000\u0000\u0200"+
+    "\u0201\u0005y\u0000\u0000\u0201M\u0001\u0000\u0000\u0000\u0202\u0203\u0005"+
+    "a\u0000\u0000\u0203\u0204\u0005n\u0000\u0000\u0204\u0205\u0005d\u0000"+
+    "\u0000\u0205O\u0001\u0000\u0000\u0000\u0206\u0207\u0005a\u0000\u0000\u0207"+
+    "\u0208\u0005s\u0000\u0000\u0208\u0209\u0005c\u0000\u0000\u0209Q\u0001"+
+    "\u0000\u0000\u0000\u020a\u020b\u0005=\u0000\u0000\u020bS\u0001\u0000\u0000"+
+    "\u0000\u020c\u020d\u0005,\u0000\u0000\u020dU\u0001\u0000\u0000\u0000\u020e"+
+    "\u020f\u0005d\u0000\u0000\u020f\u0210\u0005e\u0000\u0000\u0210\u0211\u0005"+
+    "s\u0000\u0000\u0211\u0212\u0005c\u0000\u0000\u0212W\u0001\u0000\u0000"+
+    "\u0000\u0213\u0214\u0005.\u0000\u0000\u0214Y\u0001\u0000\u0000\u0000\u0215"+
+    "\u0216\u0005f\u0000\u0000\u0216\u0217\u0005a\u0000\u0000\u0217\u0218\u0005"+
+    "l\u0000\u0000\u0218\u0219\u0005s\u0000\u0000\u0219\u021a\u0005e\u0000"+
+    "\u0000\u021a[\u0001\u0000\u0000\u0000\u021b\u021c\u0005f\u0000\u0000\u021c"+
+    "\u021d\u0005i\u0000\u0000\u021d\u021e\u0005r\u0000\u0000\u021e\u021f\u0005"+
+    "s\u0000\u0000\u021f\u0220\u0005t\u0000\u0000\u0220]\u0001\u0000\u0000"+
+    "\u0000\u0221\u0222\u0005l\u0000\u0000\u0222\u0223\u0005a\u0000\u0000\u0223"+
+    "\u0224\u0005s\u0000\u0000\u0224\u0225\u0005t\u0000\u0000\u0225_\u0001"+
+    "\u0000\u0000\u0000\u0226\u0227\u0005(\u0000\u0000\u0227a\u0001\u0000\u0000"+
+    "\u0000\u0228\u0229\u0005i\u0000\u0000\u0229\u022a\u0005n\u0000\u0000\u022a"+
+    "c\u0001\u0000\u0000\u0000\u022b\u022c\u0005l\u0000\u0000\u022c\u022d\u0005"+
+    "i\u0000\u0000\u022d\u022e\u0005k\u0000\u0000\u022e\u022f\u0005e\u0000"+
+    "\u0000\u022fe\u0001\u0000\u0000\u0000\u0230\u0231\u0005n\u0000\u0000\u0231"+
+    "\u0232\u0005o\u0000\u0000\u0232\u0233\u0005t\u0000\u0000\u0233g\u0001"+
+    "\u0000\u0000\u0000\u0234\u0235\u0005n\u0000\u0000\u0235\u0236\u0005u\u0000"+
+    "\u0000\u0236\u0237\u0005l\u0000\u0000\u0237\u0238\u0005l\u0000\u0000\u0238"+
+    "i\u0001\u0000\u0000\u0000\u0239\u023a\u0005n\u0000\u0000\u023a\u023b\u0005"+
+    "u\u0000\u0000\u023b\u023c\u0005l\u0000\u0000\u023c\u023d\u0005l\u0000"+
+    "\u0000\u023d\u023e\u0005s\u0000\u0000\u023ek\u0001\u0000\u0000\u0000\u023f"+
+    "\u0240\u0005o\u0000\u0000\u0240\u0241\u0005r\u0000\u0000\u0241m\u0001"+
+    "\u0000\u0000\u0000\u0242\u0243\u0005?\u0000\u0000\u0243o\u0001\u0000\u0000"+
+    "\u0000\u0244\u0245\u0005r\u0000\u0000\u0245\u0246\u0005l\u0000\u0000\u0246"+
+    "\u0247\u0005i\u0000\u0000\u0247\u0248\u0005k\u0000\u0000\u0248\u0249\u0005"+
+    "e\u0000\u0000\u0249q\u0001\u0000\u0000\u0000\u024a\u024b\u0005)\u0000"+
+    "\u0000\u024bs\u0001\u0000\u0000\u0000\u024c\u024d\u0005t\u0000\u0000\u024d"+
+    "\u024e\u0005r\u0000\u0000\u024e\u024f\u0005u\u0000\u0000\u024f\u0250\u0005"+
+    "e\u0000\u0000\u0250u\u0001\u0000\u0000\u0000\u0251\u0252\u0005i\u0000"+
+    "\u0000\u0252\u0253\u0005n\u0000\u0000\u0253\u0254\u0005f\u0000\u0000\u0254"+
+    "\u0255\u0005o\u0000\u0000\u0255w\u0001\u0000\u0000\u0000\u0256\u0257\u0005"+
+    "f\u0000\u0000\u0257\u0258\u0005u\u0000\u0000\u0258\u0259\u0005n\u0000"+
+    "\u0000\u0259\u025a\u0005c\u0000\u0000\u025a\u025b\u0005t\u0000\u0000\u025b"+
+    "\u025c\u0005i\u0000\u0000\u025c\u025d\u0005o\u0000\u0000\u025d\u025e\u0005"+
+    "n\u0000\u0000\u025e\u025f\u0005s\u0000\u0000\u025fy\u0001\u0000\u0000"+
+    "\u0000\u0260\u0261\u0005=\u0000\u0000\u0261\u0262\u0005=\u0000\u0000\u0262"+
+    "{\u0001\u0000\u0000\u0000\u0263\u0264\u0005!\u0000\u0000\u0264\u0265\u0005"+
+    "=\u0000\u0000\u0265}\u0001\u0000\u0000\u0000\u0266\u0267\u0005<\u0000"+
+    "\u0000\u0267\u007f\u0001\u0000\u0000\u0000\u0268\u0269\u0005<\u0000\u0000"+
+    "\u0269\u026a\u0005=\u0000\u0000\u026a\u0081\u0001\u0000\u0000\u0000\u026b"+
+    "\u026c\u0005>\u0000\u0000\u026c\u0083\u0001\u0000\u0000\u0000\u026d\u026e"+
+    "\u0005>\u0000\u0000\u026e\u026f\u0005=\u0000\u0000\u026f\u0085\u0001\u0000"+
+    "\u0000\u0000\u0270\u0271\u0005+\u0000\u0000\u0271\u0087\u0001\u0000\u0000"+
+    "\u0000\u0272\u0273\u0005-\u0000\u0000\u0273\u0089\u0001\u0000\u0000\u0000"+
+    "\u0274\u0275\u0005*\u0000\u0000\u0275\u008b\u0001\u0000\u0000\u0000\u0276"+
+    "\u0277\u0005/\u0000\u0000\u0277\u008d\u0001\u0000\u0000\u0000\u0278\u0279"+
+    "\u0005%\u0000\u0000\u0279\u008f\u0001\u0000\u0000\u0000\u027a\u027b\u0005"+
+    "[\u0000\u0000\u027b\u027c\u0001\u0000\u0000\u0000\u027c\u027d\u0006F\u0000"+
+    "\u0000\u027d\u027e\u0006F\u0000\u0000\u027e\u0091\u0001\u0000\u0000\u0000"+
+    "\u027f\u0280\u0005]\u0000\u0000\u0280\u0281\u0001\u0000\u0000\u0000\u0281"+
+    "\u0282\u0006G\u0007\u0000\u0282\u0283\u0006G\u0007\u0000\u0283\u0093\u0001"+
+    "\u0000\u0000\u0000\u0284\u028a\u0003>\u001d\u0000\u0285\u0289\u0003>\u001d"+
+    "\u0000\u0286\u0289\u0003<\u001c\u0000\u0287\u0289\u0005_\u0000\u0000\u0288"+
+    "\u0285\u0001\u0000\u0000\u0000\u0288\u0286\u0001\u0000\u0000\u0000\u0288"+
+    "\u0287\u0001\u0000\u0000\u0000\u0289\u028c\u0001\u0000\u0000\u0000\u028a"+
+    "\u0288\u0001\u0000\u0000\u0000\u028a\u028b\u0001\u0000\u0000\u0000\u028b"+
+    "\u0296\u0001\u0000\u0000\u0000\u028c\u028a\u0001\u0000\u0000\u0000\u028d"+
+    "\u0291\u0007\t\u0000\u0000\u028e\u0292\u0003>\u001d\u0000\u028f\u0292"+
+    "\u0003<\u001c\u0000\u0290\u0292\u0005_\u0000\u0000\u0291\u028e\u0001\u0000"+
+    "\u0000\u0000\u0291\u028f\u0001\u0000\u0000\u0000\u0291\u0290\u0001\u0000"+
+    "\u0000\u0000\u0292\u0293\u0001\u0000\u0000\u0000\u0293\u0291\u0001\u0000"+
+    "\u0000\u0000\u0293\u0294\u0001\u0000\u0000\u0000\u0294\u0296\u0001\u0000"+
+    "\u0000\u0000\u0295\u0284\u0001\u0000\u0000\u0000\u0295\u028d\u0001\u0000"+
+    "\u0000\u0000\u0296\u0095\u0001\u0000\u0000\u0000\u0297\u029d\u0005`\u0000"+
+    "\u0000\u0298\u029c\b\n\u0000\u0000\u0299\u029a\u0005`\u0000\u0000\u029a"+
+    "\u029c\u0005`\u0000\u0000\u029b\u0298\u0001\u0000\u0000\u0000\u029b\u0299"+
+    "\u0001\u0000\u0000\u0000\u029c\u029f\u0001\u0000\u0000\u0000\u029d\u029b"+
+    "\u0001\u0000\u0000\u0000\u029d\u029e\u0001\u0000\u0000\u0000\u029e\u02a0"+
+    "\u0001\u0000\u0000\u0000\u029f\u029d\u0001\u0000\u0000\u0000\u02a0\u02a1"+
+    "\u0005`\u0000\u0000\u02a1\u0097\u0001\u0000\u0000\u0000\u02a2\u02a3\u0003"+
+    "*\u0013\u0000\u02a3\u02a4\u0001\u0000\u0000\u0000\u02a4\u02a5\u0006J\u0003"+
+    "\u0000\u02a5\u0099\u0001\u0000\u0000\u0000\u02a6\u02a7\u0003,\u0014\u0000"+
+    "\u02a7\u02a8\u0001\u0000\u0000\u0000\u02a8\u02a9\u0006K\u0003\u0000\u02a9"+
+    "\u009b\u0001\u0000\u0000\u0000\u02aa\u02ab\u0003.\u0015\u0000\u02ab\u02ac"+
+    "\u0001\u0000\u0000\u0000\u02ac\u02ad\u0006L\u0003\u0000\u02ad\u009d\u0001"+
+    "\u0000\u0000\u0000\u02ae\u02af\u0005|\u0000\u0000\u02af\u02b0\u0001\u0000"+
+    "\u0000\u0000\u02b0\u02b1\u0006M\u0006\u0000\u02b1\u02b2\u0006M\u0007\u0000"+
+    "\u02b2\u009f\u0001\u0000\u0000\u0000\u02b3\u02b4\u0005[\u0000\u0000\u02b4"+
+    "\u02b5\u0001\u0000\u0000\u0000\u02b5\u02b6\u0006N\u0004\u0000\u02b6\u02b7"+
+    "\u0006N\u0001\u0000\u02b7\u02b8\u0006N\u0001\u0000\u02b8\u00a1\u0001\u0000"+
+    "\u0000\u0000\u02b9\u02ba\u0005]\u0000\u0000\u02ba\u02bb\u0001\u0000\u0000"+
+    "\u0000\u02bb\u02bc\u0006O\u0007\u0000\u02bc\u02bd\u0006O\u0007\u0000\u02bd"+
+    "\u02be\u0006O\b\u0000\u02be\u00a3\u0001\u0000\u0000\u0000\u02bf\u02c0"+
+    "\u0005,\u0000\u0000\u02c0\u02c1\u0001\u0000\u0000\u0000\u02c1\u02c2\u0006"+
+    "P\t\u0000\u02c2\u00a5\u0001\u0000\u0000\u0000\u02c3\u02c4\u0005=\u0000"+
+    "\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6\u0006Q\n\u0000"+
+    "\u02c6\u00a7\u0001\u0000\u0000\u0000\u02c7\u02c8\u0005a\u0000\u0000\u02c8"+
+    "\u02c9\u0005s\u0000\u0000\u02c9\u00a9\u0001\u0000\u0000\u0000\u02ca\u02cb"+
+    "\u0005m\u0000\u0000\u02cb\u02cc\u0005e\u0000\u0000\u02cc\u02cd\u0005t"+
+    "\u0000\u0000\u02cd\u02ce\u0005a\u0000\u0000\u02ce\u02cf\u0005d\u0000\u0000"+
+    "\u02cf\u02d0\u0005a\u0000\u0000\u02d0\u02d1\u0005t\u0000\u0000\u02d1\u02d2"+
+    "\u0005a\u0000\u0000\u02d2\u00ab\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005"+
+    "o\u0000\u0000\u02d4\u02d5\u0005n\u0000\u0000\u02d5\u00ad\u0001\u0000\u0000"+
+    "\u0000\u02d6\u02d7\u0005w\u0000\u0000\u02d7\u02d8\u0005i\u0000\u0000\u02d8"+
+    "\u02d9\u0005t\u0000\u0000\u02d9\u02da\u0005h\u0000\u0000\u02da\u00af\u0001"+
+    "\u0000\u0000\u0000\u02db\u02dd\u0003\u00b2W\u0000\u02dc\u02db\u0001\u0000"+
+    "\u0000\u0000\u02dd\u02de\u0001\u0000\u0000\u0000\u02de\u02dc\u0001\u0000"+
+    "\u0000\u0000\u02de\u02df\u0001\u0000\u0000\u0000\u02df\u00b1\u0001\u0000"+
+    "\u0000\u0000\u02e0\u02e2\b\u000b\u0000\u0000\u02e1\u02e0\u0001\u0000\u0000"+
+    "\u0000\u02e2\u02e3\u0001\u0000\u0000\u0000\u02e3\u02e1\u0001\u0000\u0000"+
+    "\u0000\u02e3\u02e4\u0001\u0000\u0000\u0000\u02e4\u02e8\u0001\u0000\u0000"+
+    "\u0000\u02e5\u02e6\u0005/\u0000\u0000\u02e6\u02e8\b\f\u0000\u0000\u02e7"+
+    "\u02e1\u0001\u0000\u0000\u0000\u02e7\u02e5\u0001\u0000\u0000\u0000\u02e8"+
+    "\u00b3\u0001\u0000\u0000\u0000\u02e9\u02ea\u0003\u0096I\u0000\u02ea\u00b5"+
+    "\u0001\u0000\u0000\u0000\u02eb\u02ec\u0003*\u0013\u0000\u02ec\u02ed\u0001"+
+    "\u0000\u0000\u0000\u02ed\u02ee\u0006Y\u0003\u0000\u02ee\u00b7\u0001\u0000"+
+    "\u0000\u0000\u02ef\u02f0\u0003,\u0014\u0000\u02f0\u02f1\u0001\u0000\u0000"+
+    "\u0000\u02f1\u02f2\u0006Z\u0003\u0000\u02f2\u00b9\u0001\u0000\u0000\u0000"+
+    "\u02f3\u02f4\u0003.\u0015\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5"+
+    "\u02f6\u0006[\u0003\u0000\u02f6\u00bb\u0001\u0000\u0000\u0000&\u0000\u0001"+
+    "\u0002\u0003\u0158\u0162\u0166\u0169\u0172\u0174\u017f\u01a8\u01ad\u01b2"+
+    "\u01b4\u01bf\u01c7\u01ca\u01cc\u01d1\u01d6\u01dc\u01e3\u01e8\u01ee\u01f1"+
+    "\u01f9\u01fd\u0288\u028a\u0291\u0293\u0295\u029b\u029d\u02de\u02e3\u02e7"+
+    "\u000b\u0005\u0002\u0000\u0005\u0003\u0000\u0005\u0001\u0000\u0000\u0001"+
+    "\u0000\u0007@\u0000\u0005\u0000\u0000\u0007\u001a\u0000\u0004\u0000\u0000"+
+    "\u0007A\u0000\u0007\"\u0000\u0007!\u0000";
   public static final ATN _ATN =
     new ATNDeserializer().deserialize(_serializedATN.toCharArray());
   static {

File diff suppressed because it is too large
+ 2 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp


+ 18 - 17
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java

@@ -27,9 +27,9 @@ public class EsqlBaseParser extends Parser {
     RP=49, TRUE=50, INFO=51, FUNCTIONS=52, EQ=53, NEQ=54, LT=55, LTE=56, GT=57, 
     GTE=58, PLUS=59, MINUS=60, ASTERISK=61, SLASH=62, PERCENT=63, OPENING_BRACKET=64, 
     CLOSING_BRACKET=65, UNQUOTED_IDENTIFIER=66, QUOTED_IDENTIFIER=67, EXPR_LINE_COMMENT=68, 
-    EXPR_MULTILINE_COMMENT=69, EXPR_WS=70, METADATA=71, ON=72, WITH=73, SRC_UNQUOTED_IDENTIFIER=74, 
-    SRC_QUOTED_IDENTIFIER=75, SRC_LINE_COMMENT=76, SRC_MULTILINE_COMMENT=77, 
-    SRC_WS=78, EXPLAIN_PIPE=79;
+    EXPR_MULTILINE_COMMENT=69, EXPR_WS=70, AS=71, METADATA=72, ON=73, WITH=74, 
+    SRC_UNQUOTED_IDENTIFIER=75, SRC_QUOTED_IDENTIFIER=76, SRC_LINE_COMMENT=77, 
+    SRC_MULTILINE_COMMENT=78, SRC_WS=79, EXPLAIN_PIPE=80;
   public static final int
     RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, 
     RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, 
@@ -71,7 +71,7 @@ public class EsqlBaseParser extends Parser {
       "'('", "'in'", "'like'", "'not'", "'null'", "'nulls'", "'or'", "'?'", 
       "'rlike'", "')'", "'true'", "'info'", "'functions'", "'=='", "'!='", 
       "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, 
-      "']'", null, null, null, null, null, "'metadata'", "'on'", "'with'"
+      "']'", null, null, null, null, null, "'as'", "'metadata'", "'on'", "'with'"
     };
   }
   private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -87,8 +87,9 @@ public class EsqlBaseParser extends Parser {
       "INFO", "FUNCTIONS", "EQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", 
       "ASTERISK", "SLASH", "PERCENT", "OPENING_BRACKET", "CLOSING_BRACKET", 
       "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", 
-      "EXPR_WS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", "SRC_QUOTED_IDENTIFIER", 
-      "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", "SRC_WS", "EXPLAIN_PIPE"
+      "EXPR_WS", "AS", "METADATA", "ON", "WITH", "SRC_UNQUOTED_IDENTIFIER", 
+      "SRC_QUOTED_IDENTIFIER", "SRC_LINE_COMMENT", "SRC_MULTILINE_COMMENT", 
+      "SRC_WS", "EXPLAIN_PIPE"
     };
   }
   private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -3168,9 +3169,9 @@ public class EsqlBaseParser extends Parser {
 
   @SuppressWarnings("CheckReturnValue")
   public static class RenameClauseContext extends ParserRuleContext {
-    public SourceIdentifierContext newName;
     public SourceIdentifierContext oldName;
-    public TerminalNode ASSIGN() { return getToken(EsqlBaseParser.ASSIGN, 0); }
+    public SourceIdentifierContext newName;
+    public TerminalNode AS() { return getToken(EsqlBaseParser.AS, 0); }
     public List<SourceIdentifierContext> sourceIdentifier() {
       return getRuleContexts(SourceIdentifierContext.class);
     }
@@ -3203,11 +3204,11 @@ public class EsqlBaseParser extends Parser {
       enterOuterAlt(_localctx, 1);
       {
       setState(407);
-      ((RenameClauseContext)_localctx).newName = sourceIdentifier();
+      ((RenameClauseContext)_localctx).oldName = sourceIdentifier();
       setState(408);
-      match(ASSIGN);
+      match(AS);
       setState(409);
-      ((RenameClauseContext)_localctx).oldName = sourceIdentifier();
+      ((RenameClauseContext)_localctx).newName = sourceIdentifier();
       }
     }
     catch (RecognitionException re) {
@@ -4213,7 +4214,7 @@ public class EsqlBaseParser extends Parser {
   }
 
   public static final String _serializedATN =
-    "\u0004\u0001O\u01e8\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
+    "\u0004\u0001P\u01e8\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+
     "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+
     "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+
     "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+
@@ -4285,7 +4286,7 @@ public class EsqlBaseParser extends Parser {
     ",\f,\u01dd\t,\u0003,\u01df\b,\u0001-\u0001-\u0001-\u0003-\u01e4\b-\u0001"+
     "-\u0001-\u0001-\u0000\u0003\u0002\n\u0010.\u0000\u0002\u0004\u0006\b\n"+
     "\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.0246"+
-    "8:<>@BDFHJLNPRTVXZ\u0000\b\u0001\u0000;<\u0001\u0000=?\u0001\u0000JK\u0001"+
+    "8:<>@BDFHJLNPRTVXZ\u0000\b\u0001\u0000;<\u0001\u0000=?\u0001\u0000KL\u0001"+
     "\u0000BC\u0002\u0000  ##\u0001\u0000&\'\u0002\u0000%%22\u0001\u00005:"+
     "\u0202\u0000\\\u0001\u0000\u0000\u0000\u0002_\u0001\u0000\u0000\u0000"+
     "\u0004n\u0001\u0000\u0000\u0000\u0006}\u0001\u0000\u0000\u0000\b\u007f"+
@@ -4398,7 +4399,7 @@ public class EsqlBaseParser extends Parser {
     "\u00fe\u0001\u0000\u0000\u0000\u00fc\u00fa\u0001\u0000\u0000\u0000\u00fd"+
     "\u00ff\u0003\u001c\u000e\u0000\u00fe\u00fd\u0001\u0000\u0000\u0000\u00fe"+
     "\u00ff\u0001\u0000\u0000\u0000\u00ff\u001b\u0001\u0000\u0000\u0000\u0100"+
-    "\u0101\u0005@\u0000\u0000\u0101\u0102\u0005G\u0000\u0000\u0102\u0107\u0003"+
+    "\u0101\u0005@\u0000\u0000\u0101\u0102\u0005H\u0000\u0000\u0102\u0107\u0003"+
     "&\u0013\u0000\u0103\u0104\u0005\"\u0000\u0000\u0104\u0106\u0003&\u0013"+
     "\u0000\u0105\u0103\u0001\u0000\u0000\u0000\u0106\u0109\u0001\u0000\u0000"+
     "\u0000\u0107\u0105\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000"+
@@ -4481,7 +4482,7 @@ public class EsqlBaseParser extends Parser {
     ":\u001d\u0000\u0192\u0190\u0001\u0000\u0000\u0000\u0193\u0196\u0001\u0000"+
     "\u0000\u0000\u0194\u0192\u0001\u0000\u0000\u0000\u0194\u0195\u0001\u0000"+
     "\u0000\u0000\u01959\u0001\u0000\u0000\u0000\u0196\u0194\u0001\u0000\u0000"+
-    "\u0000\u0197\u0198\u0003&\u0013\u0000\u0198\u0199\u0005!\u0000\u0000\u0199"+
+    "\u0000\u0197\u0198\u0003&\u0013\u0000\u0198\u0199\u0005G\u0000\u0000\u0199"+
     "\u019a\u0003&\u0013\u0000\u019a;\u0001\u0000\u0000\u0000\u019b\u019c\u0005"+
     "\u0001\u0000\u0000\u019c\u019d\u0003\u0012\t\u0000\u019d\u019f\u0003N"+
     "\'\u0000\u019e\u01a0\u0003B!\u0000\u019f\u019e\u0001\u0000\u0000\u0000"+
@@ -4509,9 +4510,9 @@ public class EsqlBaseParser extends Parser {
     "\u0000\u01cc\u01ce\u00054\u0000\u0000\u01cd\u01c9\u0001\u0000\u0000\u0000"+
     "\u01cd\u01cb\u0001\u0000\u0000\u0000\u01ceW\u0001\u0000\u0000\u0000\u01cf"+
     "\u01d0\u0005\u0003\u0000\u0000\u01d0\u01d3\u0003&\u0013\u0000\u01d1\u01d2"+
-    "\u0005H\u0000\u0000\u01d2\u01d4\u0003&\u0013\u0000\u01d3\u01d1\u0001\u0000"+
+    "\u0005I\u0000\u0000\u01d2\u01d4\u0003&\u0013\u0000\u01d3\u01d1\u0001\u0000"+
     "\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000\u0000\u01d4\u01de\u0001\u0000"+
-    "\u0000\u0000\u01d5\u01d6\u0005I\u0000\u0000\u01d6\u01db\u0003Z-\u0000"+
+    "\u0000\u0000\u01d5\u01d6\u0005J\u0000\u0000\u01d6\u01db\u0003Z-\u0000"+
     "\u01d7\u01d8\u0005\"\u0000\u0000\u01d8\u01da\u0003Z-\u0000\u01d9\u01d7"+
     "\u0001\u0000\u0000\u0000\u01da\u01dd\u0001\u0000\u0000\u0000\u01db\u01d9"+
     "\u0001\u0000\u0000\u0000\u01db\u01dc\u0001\u0000\u0000\u0000\u01dc\u01df"+

+ 13 - 13
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java

@@ -455,7 +455,7 @@ public class AnalyzerTests extends ESTestCase {
     public void testRename() {
         assertProjection("""
             from test
-            | rename e = emp_no
+            | rename emp_no as e
             | keep first_name, e
             """, "first_name", "e");
     }
@@ -463,7 +463,7 @@ public class AnalyzerTests extends ESTestCase {
     public void testChainedRename() {
         assertProjection("""
             from test
-            | rename r1 = emp_no, r2 = r1, r3 = r2
+            | rename emp_no as r1, r1 as r2, r2 as r3
             | keep first_name, r3
             """, "first_name", "r3");
     }
@@ -471,7 +471,7 @@ public class AnalyzerTests extends ESTestCase {
     public void testChainedRenameReuse() {
         assertProjection("""
             from test
-            | rename r1 = emp_no, r2 = r1, r3 = r2, r1 = first_name
+            | rename emp_no as r1, r1 as r2, r2 as r3, first_name as r1
             | keep r1, r3
             """, "r1", "r3");
     }
@@ -479,7 +479,7 @@ public class AnalyzerTests extends ESTestCase {
     public void testRenameBackAndForth() {
         assertProjection("""
             from test
-            | rename r1 = emp_no, emp_no = r1
+            | rename emp_no as r1, r1 as emp_no
             | keep emp_no
             """, "emp_no");
     }
@@ -487,14 +487,14 @@ public class AnalyzerTests extends ESTestCase {
     public void testRenameReuseAlias() {
         assertProjection("""
             from test
-            | rename e = emp_no, e = first_name
+            | rename emp_no as e, first_name as e
             """, "_meta_field", "e", "gender", "languages", "last_name", "salary");
     }
 
     public void testRenameUnsupportedField() {
         assertProjectionWithMapping("""
             from test
-            | rename u = unsupported
+            | rename unsupported as u
             | keep int, u, float
             """, "mapping-multi-field-variation.json", "int", "u", "float");
     }
@@ -502,7 +502,7 @@ public class AnalyzerTests extends ESTestCase {
     public void testRenameUnsupportedFieldChained() {
         assertProjectionWithMapping("""
             from test
-            | rename u1 = unsupported, u2 = u1
+            | rename unsupported as u1, u1 as u2
             | keep int, u2, float
             """, "mapping-multi-field-variation.json", "int", "u2", "float");
     }
@@ -510,7 +510,7 @@ public class AnalyzerTests extends ESTestCase {
     public void testRenameUnsupportedAndResolved() {
         assertProjectionWithMapping("""
             from test
-            | rename u = unsupported, f = float
+            | rename unsupported as u, float as f
             | keep int, u, f
             """, "mapping-multi-field-variation.json", "int", "u", "f");
     }
@@ -518,7 +518,7 @@ public class AnalyzerTests extends ESTestCase {
     public void testRenameUnsupportedSubFieldAndResolved() {
         assertProjectionWithMapping("""
             from test
-            | rename ss = some.string, f = float
+            | rename some.string as ss, float as f
             | keep int, ss, f
             """, "mapping-multi-field-variation.json", "int", "ss", "f");
     }
@@ -526,15 +526,15 @@ public class AnalyzerTests extends ESTestCase {
     public void testRenameUnsupportedAndUnknown() {
         verifyUnsupported("""
             from test
-            | rename t = text, d = doesnotexist
-            """, "Found 1 problem\n" + "line 2:24: Unknown column [doesnotexist]");
+            | rename text as t, doesnotexist as d
+            """, "Found 1 problem\n" + "line 2:21: Unknown column [doesnotexist]");
     }
 
     public void testRenameResolvedAndUnknown() {
         verifyUnsupported("""
             from test
-            | rename i = int, d = doesnotexist
-            """, "Found 1 problem\n" + "line 2:23: Unknown column [doesnotexist]");
+            | rename int as i, doesnotexist as d
+            """, "Found 1 problem\n" + "line 2:20: Unknown column [doesnotexist]");
     }
 
     public void testUnsupportedFieldUsedExplicitly() {

+ 7 - 7
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java

@@ -87,27 +87,27 @@ public class VerifierTests extends ESTestCase {
 
     public void testDoubleRenamingField() {
         assertEquals(
-            "1:47: Column [emp_no] renamed to [r1] and is no longer available [r3 = emp_no]",
-            error("from test | rename r1 = emp_no, r2 = r1, r3 = emp_no | keep r3")
+            "1:44: Column [emp_no] renamed to [r1] and is no longer available [emp_no as r3]",
+            error("from test | rename emp_no as r1, r1 as r2, emp_no as r3 | keep r3")
         );
     }
 
     public void testDuplicateRenaming() {
         assertEquals(
-            "1:38: Column [emp_no] renamed to [r1] and is no longer available [r1 = emp_no]",
-            error("from test | rename r1 = emp_no, r1 = emp_no | keep r1")
+            "1:34: Column [emp_no] renamed to [r1] and is no longer available [emp_no as r1]",
+            error("from test | rename emp_no as r1, emp_no as r1 | keep r1")
         );
     }
 
     public void testDoubleRenamingReference() {
         assertEquals(
-            "1:63: Column [r1] renamed to [r2] and is no longer available [r3 = r1]",
-            error("from test | rename r1 = emp_no, r2 = r1, x = first_name, r3 = r1 | keep r3")
+            "1:61: Column [r1] renamed to [r2] and is no longer available [r1 as r3]",
+            error("from test | rename emp_no as r1, r1 as r2, first_name as x, r1 as r3 | keep r3")
         );
     }
 
     public void testDropAfterRenaming() {
-        assertEquals("1:39: Unknown column [emp_no]", error("from test | rename r1 = emp_no | drop emp_no"));
+        assertEquals("1:40: Unknown column [emp_no]", error("from test | rename emp_no as r1 | drop emp_no"));
     }
 
     public void testNonStringFieldsInDissect() {

+ 17 - 17
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java

@@ -194,10 +194,10 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testCombineProjectionWhilePreservingAlias() {
         var plan = plan("""
             from test
-            | rename x = first_name
+            | rename first_name as x
             | keep x, salary
             | where salary > 10
-            | rename y = x
+            | rename x as y
             | keep y
             """);
 
@@ -241,7 +241,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testCombineProjectionWithPruning() {
         var plan = plan("""
             from test
-            | rename x = first_name
+            | rename first_name as x
             | keep x, salary, last_name
             | stats count(salary) by x
             """);
@@ -504,7 +504,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testPushDownFilterPastProject() {
         LogicalPlan plan = optimizedPlan("""
             from test
-            | rename x = emp_no
+            | rename emp_no as x
             | keep x
             | where x > 10""");
 
@@ -518,7 +518,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testPushDownEvalPastProject() {
         LogicalPlan plan = optimizedPlan("""
             from test
-            | rename x = emp_no
+            | rename emp_no as x
             | keep x
             | eval y = x * 2""");
 
@@ -539,7 +539,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testPushDownDissectPastProject() {
         LogicalPlan plan = optimizedPlan("""
             from test
-            | rename x = first_name
+            | rename first_name as x
             | keep x
             | dissect x "%{y}"
             """);
@@ -552,7 +552,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testPushDownGrokPastProject() {
         LogicalPlan plan = optimizedPlan("""
             from test
-            | rename x = first_name
+            | rename first_name as x
             | keep x
             | grok x "%{WORD:y}"
             """);
@@ -566,7 +566,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | eval y = emp_no + 1
-            | rename x = y
+            | rename y as x
             | where x > 10""");
 
         var keep = as(plan, Project.class);
@@ -582,7 +582,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | dissect first_name "%{y}"
-            | rename x = y
+            | rename y as x
             | keep x
             | where x == "foo"
             """);
@@ -600,7 +600,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | grok first_name "%{WORD:y}"
-            | rename x = y
+            | rename y as x
             | keep x
             | where x == "foo"
             """);
@@ -647,7 +647,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testPushDownLimitPastProject() {
         LogicalPlan plan = optimizedPlan("""
             from test
-            | rename a = emp_no
+            | rename emp_no as a
             | keep a
             | limit 10""");
 
@@ -814,7 +814,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | sort emp_no
-            | rename en = emp_no
+            | rename emp_no as en
             | keep salary, en
             | eval e = en * 2
             | sort salary""");
@@ -829,7 +829,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | sort emp_no
-            | rename l = salary
+            | rename salary as l
             | keep l, emp_no
             | sort l""");
 
@@ -878,7 +878,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | sort emp_no
-            | rename l = salary
+            | rename salary as l
             | keep l, emp_no, first_name
             | sort l
             | limit 100
@@ -936,7 +936,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | sort emp_no desc
-            | rename e = emp_no
+            | rename emp_no as e
             | keep e
             | sort e""");
 
@@ -1058,7 +1058,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
         LogicalPlan plan = optimizedPlan("""
             from test
             | eval a = to_string(languages)
-            | rename x = a
+            | rename a as x
             | keep x
             | enrich languages_idx on x
             """);
@@ -1070,7 +1070,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
     public void testTopNEnrich() {
         LogicalPlan plan = optimizedPlan("""
             from test
-            | rename x = languages
+            | rename languages as x
             | eval x = to_string(x)
             | keep x
             | enrich languages_idx on x

+ 4 - 4
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/ExpressionTests.java

@@ -526,7 +526,7 @@ public class ExpressionTests extends ESTestCase {
         String[] oldName = new String[] { "b", "a.c", "x.y", "a" };
         List<?> renamings;
         for (int i = 0; i < newName.length; i++) {
-            Rename r = renameExpression(newName[i] + "=" + oldName[i]);
+            Rename r = renameExpression(oldName[i] + " AS " + newName[i]);
             renamings = r.renamings();
             assertThat(renamings.size(), equalTo(1));
             assertThat(renamings.get(0), instanceOf(Alias.class));
@@ -539,7 +539,7 @@ public class ExpressionTests extends ESTestCase {
     }
 
     public void testMultipleProjectPatterns() {
-        LogicalPlan plan = parse("from a | rename x = y | keep abc, xyz*, x, *");
+        LogicalPlan plan = parse("from a | rename y as x | keep abc, xyz*, x, *");
         Project p = as(plan, Project.class);
         List<?> projections = p.projections();
         assertThat(projections.size(), equalTo(4));
@@ -553,8 +553,8 @@ public class ExpressionTests extends ESTestCase {
 
     public void testForbidWildcardProjectRename() {
         assertParsingException(
-            () -> renameExpression("a*=b*"),
-            "line 1:18: Using wildcards (*) in renaming projections is not allowed [a*=b*]"
+            () -> renameExpression("b* AS a*"),
+            "line 1:18: Using wildcards (*) in renaming projections is not allowed [b* AS a*]"
         );
     }
 

Some files were not shown because too many files changed in this diff