SQL: Implement TOP as an alternative to LIMIT (#57428) (#57507)

Add basic support for `TOP X` as a synonym to LIMIT X which is used
by [MS-SQL server](https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-ver15),
e.g.:

```
SELECT TOP 5 a, b, c FROM test
```

TOP in SQL server also supports the `PERCENTAGE` and `WITH TIES`
keywords which this implementation doesn't.

Don't allow usage of both TOP and LIMIT in the same query.

Refers to #41195

(cherry picked from commit 2f5ab81b9ad884434d1faa60f4391f966ede73e8)
This commit is contained in:
Marios Trivyzas 2020-06-02 10:53:42 +02:00 committed by GitHub
parent 02bf5fff0f
commit b8a13de20f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 1839 additions and 1591 deletions

View File

@ -84,6 +84,7 @@ s|SQL-92
|`TABLES` | |
|`THEN` |reserved |reserved
|`TO` |reserved |reserved
|`TOP` |reserved |reserved
|`TRUE` |reserved |reserved
|`TYPE` | |
|`USING` |reserved |reserved

View File

@ -6,7 +6,7 @@
.Synopsis:
[source, sql]
----
SELECT select_expr [, ...]
SELECT [TOP [ count ] ] select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
@ -25,7 +25,7 @@ The general execution of `SELECT` is as follows:
. If the `GROUP BY` clause is specified, or if there are aggregate function calls, the output is combined into groups of rows that match on one or more values, and the results of aggregate functions are computed. If the `HAVING` clause is present, it eliminates groups that do not satisfy the given condition. (See <<sql-syntax-group-by, GROUP BY Clause>> and <<sql-syntax-having, HAVING Clause>> below.)
. The actual output rows are computed using the `SELECT` output expressions for each selected row or row group.
. If the `ORDER BY` clause is specified, the returned rows are sorted in the specified order. If `ORDER BY` is not given, the rows are returned in whatever order the system finds fastest to produce. (See <<sql-syntax-order-by,ORDER BY Clause>> below.)
. If the `LIMIT` is specified, the `SELECT` statement only returns a subset of the result rows. (See <<sql-syntax-limit, LIMIT Clause>> below.)
. If the `LIMIT` or `TOP` is specified (cannot use both in the same query), the `SELECT` statement only returns a subset of the result rows. (See <<sql-syntax-limit, LIMIT Clause>> and <<sql-syntax-top, TOP clause>> below.)
[[sql-syntax-select-list]]
@ -69,6 +69,30 @@ include-tagged::{sql-specs}/docs/docs.csv-spec[wildcardWithOrder]
which essentially returns all(top-level fields, sub-fields, such as multi-fields are ignored] columns found.
[[sql-syntax-top]]
==== TOP
The `TOP` clause can be used before the <<sql-syntax-select-list, `SELECT` list>> or the <<sql-syntax-select-wildcard, `wildcard`> to
restrict (limit) the number of rows returned using the format:
[source, sql]
----
SELECT TOP <count> <select list> ...
----
where
count:: is a positive integer or zero indicating the maximum *possible* number of results being returned (as there might be fewer matches
than the limit). If `0` is specified, no results are returned.
[source, sql]
----
include-tagged::{sql-specs}/docs/docs.csv-spec[topBasic]
----
[NOTE]
<<sql-syntax-top, `TOP`>> and <<sql-syntax-limit, `LIMIT`>> cannot be used together in the same query and an error is returned otherwise.
[[sql-syntax-from]]
==== FROM Clause
@ -336,7 +360,7 @@ include-tagged::{sql-specs}/docs/docs.csv-spec[orderByAgg]
----
IMPORTANT: Ordering by aggregation is possible for up to *10000* entries for memory consumption reasons.
In cases where the results pass this threshold, use <<sql-syntax-limit,`LIMIT`>> to reduce the number
In cases where the results pass this threshold, use <<sql-syntax-limit,`LIMIT`>> or <<sql-syntax-top, `TOP`>> to reduce the number
of results.
[[sql-syntax-order-by-score]]
@ -371,26 +395,28 @@ all are equally relevant.
[[sql-syntax-limit]]
==== LIMIT
The `LIMIT` clause restricts (limits) the number of rows returns using the format:
The `LIMIT` clause restricts (limits) the number of rows returned using the format:
[source, sql]
----
LIMIT ( count | ALL )
LIMIT ( <count> | ALL )
----
where
count:: is a positive integer or zero indicating the maximum *possible* number of results being returned (as there might be less matches than the limit). If `0` is specified, no results are returned.
count:: is a positive integer or zero indicating the maximum *possible* number of results being returned (as there might be fewer matches
than the limit). If `0` is specified, no results are returned.
ALL:: indicates there is no limit and thus all results are being returned.
To return
[source, sql]
----
include-tagged::{sql-specs}/docs/docs.csv-spec[limitBasic]
----
[NOTE]
<<sql-syntax-top, `TOP`>> and <<sql-syntax-limit, `LIMIT`>> cannot be used together in the same query and an error is returned otherwise.
[[sql-syntax-pivot]]
==== PIVOT

View File

@ -1127,6 +1127,18 @@ Georgi |Facello |10001
// end::limitBasic
;
topBasic
// tag::topBasic
SELECT TOP 2 first_name, last_name, emp_no FROM emp;
first_name | last_name | emp_no
---------------+---------------+---------------
Georgi |Facello |10001
Bezalel |Simmel |10002
// end::topBasic
;
///////////////////////////////
//
// Aggregations

View File

@ -187,3 +187,41 @@ SELECT emp_no, CAST(languages NOT IN (2, 3) AS STRING), CAST(NOT languages IN (2
10019 |true |null
10020 |null |null
;
topWithWildCard
schema::birth_date:ts|emp_no:i|first_name:s|gender:s|hire_date:ts|languages:byte|last_name:s|salary:i
SELECT TOP 5 * FROM test_emp ORDER BY emp_no;
birth_date | emp_no | first_name | gender | hire_date | languages | last_name | salary
------------------------+---------------+---------------+---------------+------------------------+---------------+---------------+---------------
1953-09-02T00:00:00.000Z|10001 |Georgi |M |1986-06-26T00:00:00.000Z|2 |Facello |57305
1964-06-02T00:00:00.000Z|10002 |Bezalel |F |1985-11-21T00:00:00.000Z|5 |Simmel |56371
1959-12-03T00:00:00.000Z|10003 |Parto |M |1986-08-28T00:00:00.000Z|4 |Bamford |61805
1954-05-01T00:00:00.000Z|10004 |Chirstian |M |1986-12-01T00:00:00.000Z|5 |Koblick |36174
1955-01-21T00:00:00.000Z|10005 |Kyoichi |M |1989-09-12T00:00:00.000Z|1 |Maliniak |63528
;
topWithColumnNames
SELECT TOP 7 emp_no, first_name, last_name FROM test_emp ORDER BY emp_no DESC;
emp_no | first_name | last_name
---------------+---------------+---------------
10100 |Hironobu |Haraldson
10099 |Valter |Sullins
10098 |Sreekrishna |Servieres
10097 |Remzi |Waschkowski
10096 |Jayson |Mandell
10095 |Hilari |Morton
10094 |Arumugam |Ossenbruggen
;
topWithAggregations
schema::cnt:l|emp_no % languages:i
SELECT TOP 3 count(*) AS cnt, emp_no % languages FROM test_emp GROUP BY 2 ORDER BY 1 DESC;
cnt | emp_no % languages
----------+-------------------
37 |0
24 |1
16 |2
;

View File

@ -90,7 +90,7 @@ orderBy
;
querySpecification
: SELECT setQuantifier? selectItems
: SELECT topClause? setQuantifier? selectItems
fromClause?
(WHERE where=booleanExpression)?
(GROUP BY groupBy)?
@ -118,6 +118,10 @@ namedQuery
: name=identifier AS '(' queryNoWith ')'
;
topClause
: TOP top=INTEGER_VALUE
;
setQuantifier
: DISTINCT
| ALL
@ -376,7 +380,7 @@ nonReserved
| QUERY
| RLIKE
| SCHEMAS | SECOND | SHOW | SYS
| TABLES | TEXT | TYPE | TYPES
| TABLES | TEXT | TOP | TYPE | TYPES
| VERIFY
| YEAR
;
@ -469,6 +473,7 @@ TEXT: 'TEXT';
THEN: 'THEN';
TRUE: 'TRUE';
TO: 'TO';
TOP: 'TOP';
TYPE: 'TYPE';
TYPES: 'TYPES';
USING: 'USING';

View File

@ -90,53 +90,54 @@ TEXT=89
THEN=90
TRUE=91
TO=92
TYPE=93
TYPES=94
USING=95
VERIFY=96
WHEN=97
WHERE=98
WITH=99
YEAR=100
YEARS=101
ESCAPE_ESC=102
FUNCTION_ESC=103
LIMIT_ESC=104
DATE_ESC=105
TIME_ESC=106
TIMESTAMP_ESC=107
GUID_ESC=108
ESC_START=109
ESC_END=110
EQ=111
NULLEQ=112
NEQ=113
LT=114
LTE=115
GT=116
GTE=117
PLUS=118
MINUS=119
ASTERISK=120
SLASH=121
PERCENT=122
CAST_OP=123
CONCAT=124
DOT=125
PARAM=126
STRING=127
INTEGER_VALUE=128
DECIMAL_VALUE=129
IDENTIFIER=130
DIGIT_IDENTIFIER=131
TABLE_IDENTIFIER=132
QUOTED_IDENTIFIER=133
BACKQUOTED_IDENTIFIER=134
SIMPLE_COMMENT=135
BRACKETED_COMMENT=136
WS=137
UNRECOGNIZED=138
DELIMITER=139
TOP=93
TYPE=94
TYPES=95
USING=96
VERIFY=97
WHEN=98
WHERE=99
WITH=100
YEAR=101
YEARS=102
ESCAPE_ESC=103
FUNCTION_ESC=104
LIMIT_ESC=105
DATE_ESC=106
TIME_ESC=107
TIMESTAMP_ESC=108
GUID_ESC=109
ESC_START=110
ESC_END=111
EQ=112
NULLEQ=113
NEQ=114
LT=115
LTE=116
GT=117
GTE=118
PLUS=119
MINUS=120
ASTERISK=121
SLASH=122
PERCENT=123
CAST_OP=124
CONCAT=125
DOT=126
PARAM=127
STRING=128
INTEGER_VALUE=129
DECIMAL_VALUE=130
IDENTIFIER=131
DIGIT_IDENTIFIER=132
TABLE_IDENTIFIER=133
QUOTED_IDENTIFIER=134
BACKQUOTED_IDENTIFIER=135
SIMPLE_COMMENT=136
BRACKETED_COMMENT=137
WS=138
UNRECOGNIZED=139
DELIMITER=140
'('=1
')'=2
','=3
@ -229,28 +230,29 @@ DELIMITER=139
'THEN'=90
'TRUE'=91
'TO'=92
'TYPE'=93
'TYPES'=94
'USING'=95
'VERIFY'=96
'WHEN'=97
'WHERE'=98
'WITH'=99
'YEAR'=100
'YEARS'=101
'}'=110
'='=111
'<=>'=112
'<'=114
'<='=115
'>'=116
'>='=117
'+'=118
'-'=119
'*'=120
'/'=121
'%'=122
'::'=123
'||'=124
'.'=125
'?'=126
'TOP'=93
'TYPE'=94
'TYPES'=95
'USING'=96
'VERIFY'=97
'WHEN'=98
'WHERE'=99
'WITH'=100
'YEAR'=101
'YEARS'=102
'}'=111
'='=112
'<=>'=113
'<'=115
'<='=116
'>'=117
'>='=118
'+'=119
'-'=120
'*'=121
'/'=122
'%'=123
'::'=124
'||'=125
'.'=126
'?'=127

View File

@ -90,52 +90,53 @@ TEXT=89
THEN=90
TRUE=91
TO=92
TYPE=93
TYPES=94
USING=95
VERIFY=96
WHEN=97
WHERE=98
WITH=99
YEAR=100
YEARS=101
ESCAPE_ESC=102
FUNCTION_ESC=103
LIMIT_ESC=104
DATE_ESC=105
TIME_ESC=106
TIMESTAMP_ESC=107
GUID_ESC=108
ESC_START=109
ESC_END=110
EQ=111
NULLEQ=112
NEQ=113
LT=114
LTE=115
GT=116
GTE=117
PLUS=118
MINUS=119
ASTERISK=120
SLASH=121
PERCENT=122
CAST_OP=123
CONCAT=124
DOT=125
PARAM=126
STRING=127
INTEGER_VALUE=128
DECIMAL_VALUE=129
IDENTIFIER=130
DIGIT_IDENTIFIER=131
TABLE_IDENTIFIER=132
QUOTED_IDENTIFIER=133
BACKQUOTED_IDENTIFIER=134
SIMPLE_COMMENT=135
BRACKETED_COMMENT=136
WS=137
UNRECOGNIZED=138
TOP=93
TYPE=94
TYPES=95
USING=96
VERIFY=97
WHEN=98
WHERE=99
WITH=100
YEAR=101
YEARS=102
ESCAPE_ESC=103
FUNCTION_ESC=104
LIMIT_ESC=105
DATE_ESC=106
TIME_ESC=107
TIMESTAMP_ESC=108
GUID_ESC=109
ESC_START=110
ESC_END=111
EQ=112
NULLEQ=113
NEQ=114
LT=115
LTE=116
GT=117
GTE=118
PLUS=119
MINUS=120
ASTERISK=121
SLASH=122
PERCENT=123
CAST_OP=124
CONCAT=125
DOT=126
PARAM=127
STRING=128
INTEGER_VALUE=129
DECIMAL_VALUE=130
IDENTIFIER=131
DIGIT_IDENTIFIER=132
TABLE_IDENTIFIER=133
QUOTED_IDENTIFIER=134
BACKQUOTED_IDENTIFIER=135
SIMPLE_COMMENT=136
BRACKETED_COMMENT=137
WS=138
UNRECOGNIZED=139
'('=1
')'=2
','=3
@ -228,28 +229,29 @@ UNRECOGNIZED=138
'THEN'=90
'TRUE'=91
'TO'=92
'TYPE'=93
'TYPES'=94
'USING'=95
'VERIFY'=96
'WHEN'=97
'WHERE'=98
'WITH'=99
'YEAR'=100
'YEARS'=101
'}'=110
'='=111
'<=>'=112
'<'=114
'<='=115
'>'=116
'>='=117
'+'=118
'-'=119
'*'=120
'/'=121
'%'=122
'::'=123
'||'=124
'.'=125
'?'=126
'TOP'=93
'TYPE'=94
'TYPES'=95
'USING'=96
'VERIFY'=97
'WHEN'=98
'WHERE'=99
'WITH'=100
'YEAR'=101
'YEARS'=102
'}'=111
'='=112
'<=>'=113
'<'=115
'<='=116
'>'=117
'>='=118
'+'=119
'-'=120
'*'=121
'/'=122
'%'=123
'::'=124
'||'=125
'.'=126
'?'=127

View File

@ -105,8 +105,12 @@ abstract class LogicalPlanBuilder extends ExpressionBuilder {
if (limitClause != null) {
Token limit = limitClause.limit;
if (limit != null && limitClause.INTEGER_VALUE() != null) {
plan = new Limit(source(limitClause), new Literal(source(limitClause),
Integer.parseInt(limit.getText()), DataTypes.INTEGER), plan);
if (plan instanceof Limit) {
throw new ParsingException(source(limitClause),
"TOP and LIMIT are not allowed in the same query - use one or the other");
} else {
plan = limit(plan, source(limitClause), limit);
}
}
}
@ -155,6 +159,13 @@ abstract class LogicalPlanBuilder extends ExpressionBuilder {
if (ctx.setQuantifier() != null && ctx.setQuantifier().DISTINCT() != null) {
query = new Distinct(source(ctx.setQuantifier()), query);
}
// TOP
SqlBaseParser.TopClauseContext topClauseContext = ctx.topClause();
if (topClauseContext != null && topClauseContext.top != null && topClauseContext.INTEGER_VALUE() != null) {
query = limit(query, source(topClauseContext), topClauseContext.top);
}
return query;
}
@ -243,4 +254,8 @@ abstract class LogicalPlanBuilder extends ExpressionBuilder {
TableIdentifier tableIdentifier = visitTableIdentifier(ctx.tableIdentifier());
return new UnresolvedRelation(source(ctx), tableIdentifier, alias, ctx.FROZEN() != null);
}
private Limit limit(LogicalPlan plan, Source source, Token limit) {
return new Limit(source, new Literal(source, Integer.parseInt(limit.getText()), DataTypes.INTEGER), plan);
}
}

View File

@ -299,6 +299,18 @@ class SqlBaseBaseListener implements SqlBaseListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitNamedQuery(SqlBaseParser.NamedQueryContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterTopClause(SqlBaseParser.TopClauseContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitTopClause(SqlBaseParser.TopClauseContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -179,6 +179,13 @@ class SqlBaseBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements SqlBa
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitNamedQuery(SqlBaseParser.NamedQueryContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitTopClause(SqlBaseParser.TopClauseContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -29,15 +29,15 @@ class SqlBaseLexer extends Lexer {
NOT=66, NULL=67, NULLS=68, ON=69, OPTIMIZED=70, OR=71, ORDER=72, OUTER=73,
PARSED=74, PHYSICAL=75, PIVOT=76, PLAN=77, RIGHT=78, RLIKE=79, QUERY=80,
SCHEMAS=81, SECOND=82, SECONDS=83, SELECT=84, SHOW=85, SYS=86, TABLE=87,
TABLES=88, TEXT=89, THEN=90, TRUE=91, TO=92, TYPE=93, TYPES=94, USING=95,
VERIFY=96, WHEN=97, WHERE=98, WITH=99, YEAR=100, YEARS=101, ESCAPE_ESC=102,
FUNCTION_ESC=103, LIMIT_ESC=104, DATE_ESC=105, TIME_ESC=106, TIMESTAMP_ESC=107,
GUID_ESC=108, ESC_START=109, ESC_END=110, EQ=111, NULLEQ=112, NEQ=113,
LT=114, LTE=115, GT=116, GTE=117, PLUS=118, MINUS=119, ASTERISK=120, SLASH=121,
PERCENT=122, CAST_OP=123, CONCAT=124, DOT=125, PARAM=126, STRING=127,
INTEGER_VALUE=128, DECIMAL_VALUE=129, IDENTIFIER=130, DIGIT_IDENTIFIER=131,
TABLE_IDENTIFIER=132, QUOTED_IDENTIFIER=133, BACKQUOTED_IDENTIFIER=134,
SIMPLE_COMMENT=135, BRACKETED_COMMENT=136, WS=137, UNRECOGNIZED=138;
TABLES=88, TEXT=89, THEN=90, TRUE=91, TO=92, TOP=93, TYPE=94, TYPES=95,
USING=96, VERIFY=97, WHEN=98, WHERE=99, WITH=100, YEAR=101, YEARS=102,
ESCAPE_ESC=103, FUNCTION_ESC=104, LIMIT_ESC=105, DATE_ESC=106, TIME_ESC=107,
TIMESTAMP_ESC=108, GUID_ESC=109, ESC_START=110, ESC_END=111, EQ=112, NULLEQ=113,
NEQ=114, LT=115, LTE=116, GT=117, GTE=118, PLUS=119, MINUS=120, ASTERISK=121,
SLASH=122, PERCENT=123, CAST_OP=124, CONCAT=125, DOT=126, PARAM=127, STRING=128,
INTEGER_VALUE=129, DECIMAL_VALUE=130, IDENTIFIER=131, DIGIT_IDENTIFIER=132,
TABLE_IDENTIFIER=133, QUOTED_IDENTIFIER=134, BACKQUOTED_IDENTIFIER=135,
SIMPLE_COMMENT=136, BRACKETED_COMMENT=137, WS=138, UNRECOGNIZED=139;
public static String[] modeNames = {
"DEFAULT_MODE"
};
@ -54,9 +54,9 @@ class SqlBaseLexer extends Lexer {
"MINUTES", "MONTH", "MONTHS", "NATURAL", "NOT", "NULL", "NULLS", "ON",
"OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED", "PHYSICAL", "PIVOT", "PLAN",
"RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SECOND", "SECONDS", "SELECT", "SHOW",
"SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO", "TYPE", "TYPES",
"USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS", "ESCAPE_ESC",
"FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
"SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO", "TOP", "TYPE",
"TYPES", "USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS",
"ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
"GUID_ESC", "ESC_START", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE",
"GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP",
"CONCAT", "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE",
@ -80,10 +80,10 @@ class SqlBaseLexer extends Lexer {
"'OUTER'", "'PARSED'", "'PHYSICAL'", "'PIVOT'", "'PLAN'", "'RIGHT'", "'RLIKE'",
"'QUERY'", "'SCHEMAS'", "'SECOND'", "'SECONDS'", "'SELECT'", "'SHOW'",
"'SYS'", "'TABLE'", "'TABLES'", "'TEXT'", "'THEN'", "'TRUE'", "'TO'",
"'TYPE'", "'TYPES'", "'USING'", "'VERIFY'", "'WHEN'", "'WHERE'", "'WITH'",
"'YEAR'", "'YEARS'", null, null, null, null, null, null, null, null, "'}'",
"'='", "'<=>'", null, "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'",
"'/'", "'%'", "'::'", "'||'", "'.'", "'?'"
"'TOP'", "'TYPE'", "'TYPES'", "'USING'", "'VERIFY'", "'WHEN'", "'WHERE'",
"'WITH'", "'YEAR'", "'YEARS'", null, null, null, null, null, null, null,
null, "'}'", "'='", "'<=>'", null, "'<'", "'<='", "'>'", "'>='", "'+'",
"'-'", "'*'", "'/'", "'%'", "'::'", "'||'", "'.'", "'?'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, "ALL", "ANALYZE", "ANALYZED", "AND", "ANY",
@ -97,9 +97,9 @@ class SqlBaseLexer extends Lexer {
"MINUTES", "MONTH", "MONTHS", "NATURAL", "NOT", "NULL", "NULLS", "ON",
"OPTIMIZED", "OR", "ORDER", "OUTER", "PARSED", "PHYSICAL", "PIVOT", "PLAN",
"RIGHT", "RLIKE", "QUERY", "SCHEMAS", "SECOND", "SECONDS", "SELECT", "SHOW",
"SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO", "TYPE", "TYPES",
"USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS", "ESCAPE_ESC",
"FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
"SYS", "TABLE", "TABLES", "TEXT", "THEN", "TRUE", "TO", "TOP", "TYPE",
"TYPES", "USING", "VERIFY", "WHEN", "WHERE", "WITH", "YEAR", "YEARS",
"ESCAPE_ESC", "FUNCTION_ESC", "LIMIT_ESC", "DATE_ESC", "TIME_ESC", "TIMESTAMP_ESC",
"GUID_ESC", "ESC_START", "ESC_END", "EQ", "NULLEQ", "NEQ", "LT", "LTE",
"GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", "CAST_OP",
"CONCAT", "DOT", "PARAM", "STRING", "INTEGER_VALUE", "DECIMAL_VALUE",
@ -162,7 +162,7 @@ class SqlBaseLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\u008c\u0488\b\1\4"+
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\u008d\u048e\b\1\4"+
"\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+
"\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
@ -179,394 +179,396 @@ class SqlBaseLexer extends Lexer {
"\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+
"\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089"+
"\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+
"\4\u008e\t\u008e\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\7\3"+
"\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t"+
"\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3"+
"\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3"+
"\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3"+
"\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+
"\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3"+
"\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
"\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3"+
"\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3"+
"\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3"+
"\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3"+
"\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\""+
"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3$\3%\3"+
"%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3"+
")\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3"+
",\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3"+
"/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3"+
"\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3"+
"\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3"+
"\67\3\67\3\67\3\67\3\67\38\38\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3"+
";\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3=\3>\3>\3>\3>\3"+
">\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3"+
"A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3"+
"E\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3I\3I\3I\3I\3I\3I\3"+
"J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3"+
"M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3"+
"Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3"+
"T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3X\3X\3"+
"X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3\\"+
"\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`"+
"\3`\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d"+
"\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h"+
"\3h\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3k\3k\3k\3l\3l\3l\3l\3m\3m\3m\3m\3m"+
"\3m\3n\3n\7n\u03b5\nn\fn\16n\u03b8\13n\3o\3o\3p\3p\3q\3q\3q\3q\3r\3r\3"+
"r\3r\5r\u03c6\nr\3s\3s\3t\3t\3t\3u\3u\3v\3v\3v\3w\3w\3x\3x\3y\3y\3z\3"+
"z\3{\3{\3|\3|\3|\3}\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0080\3"+
"\u0080\7\u0080\u03ea\n\u0080\f\u0080\16\u0080\u03ed\13\u0080\3\u0080\3"+
"\u0080\3\u0081\6\u0081\u03f2\n\u0081\r\u0081\16\u0081\u03f3\3\u0082\6"+
"\u0082\u03f7\n\u0082\r\u0082\16\u0082\u03f8\3\u0082\3\u0082\7\u0082\u03fd"+
"\n\u0082\f\u0082\16\u0082\u0400\13\u0082\3\u0082\3\u0082\6\u0082\u0404"+
"\n\u0082\r\u0082\16\u0082\u0405\3\u0082\6\u0082\u0409\n\u0082\r\u0082"+
"\16\u0082\u040a\3\u0082\3\u0082\7\u0082\u040f\n\u0082\f\u0082\16\u0082"+
"\u0412\13\u0082\5\u0082\u0414\n\u0082\3\u0082\3\u0082\3\u0082\3\u0082"+
"\6\u0082\u041a\n\u0082\r\u0082\16\u0082\u041b\3\u0082\3\u0082\5\u0082"+
"\u0420\n\u0082\3\u0083\3\u0083\5\u0083\u0424\n\u0083\3\u0083\3\u0083\3"+
"\u0083\7\u0083\u0429\n\u0083\f\u0083\16\u0083\u042c\13\u0083\3\u0084\3"+
"\u0084\3\u0084\3\u0084\6\u0084\u0432\n\u0084\r\u0084\16\u0084\u0433\3"+
"\u0085\3\u0085\3\u0085\6\u0085\u0439\n\u0085\r\u0085\16\u0085\u043a\3"+
"\u0086\3\u0086\3\u0086\3\u0086\7\u0086\u0441\n\u0086\f\u0086\16\u0086"+
"\u0444\13\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\3\u0087\7\u0087"+
"\u044c\n\u0087\f\u0087\16\u0087\u044f\13\u0087\3\u0087\3\u0087\3\u0088"+
"\3\u0088\5\u0088\u0455\n\u0088\3\u0088\6\u0088\u0458\n\u0088\r\u0088\16"+
"\u0088\u0459\3\u0089\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008b\3"+
"\u008b\7\u008b\u0464\n\u008b\f\u008b\16\u008b\u0467\13\u008b\3\u008b\5"+
"\u008b\u046a\n\u008b\3\u008b\5\u008b\u046d\n\u008b\3\u008b\3\u008b\3\u008c"+
"\3\u008c\3\u008c\3\u008c\3\u008c\7\u008c\u0476\n\u008c\f\u008c\16\u008c"+
"\u0479\13\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3\u008d\6\u008d"+
"\u0481\n\u008d\r\u008d\16\u008d\u0482\3\u008d\3\u008d\3\u008e\3\u008e"+
"\3\u0477\2\u008f\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31"+
"\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65"+
"\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64"+
"g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+
"F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+
"P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+
"Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5"+
"d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9"+
"n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7u\u00e9v\u00ebw\u00ed"+
"x\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9~\u00fb\177\u00fd\u0080\u00ff"+
"\u0081\u0101\u0082\u0103\u0083\u0105\u0084\u0107\u0085\u0109\u0086\u010b"+
"\u0087\u010d\u0088\u010f\2\u0111\2\u0113\2\u0115\u0089\u0117\u008a\u0119"+
"\u008b\u011b\u008c\3\2\13\3\2))\4\2BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3"+
"\2C\\\4\2\f\f\17\17\5\2\13\f\17\17\"\"\u04a9\2\3\3\2\2\2\2\5\3\2\2\2\2"+
"\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+
"\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+
"\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+
"\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+
"\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+
"\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+
"M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+
"\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2"+
"\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2"+
"s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+
"\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+
"\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+
"\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+
"\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+
"\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+
"\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+
"\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2"+
"\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7"+
"\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+
"\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+
"\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+
"\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb"+
"\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2"+
"\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd"+
"\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2"+
"\2\2\u0107\3\2\2\2\2\u0109\3\2\2\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u0115"+
"\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b\3\2\2\2\3\u011d\3\2\2"+
"\2\5\u011f\3\2\2\2\7\u0121\3\2\2\2\t\u0123\3\2\2\2\13\u0125\3\2\2\2\r"+
"\u0129\3\2\2\2\17\u0131\3\2\2\2\21\u013a\3\2\2\2\23\u013e\3\2\2\2\25\u0142"+
"\3\2\2\2\27\u0145\3\2\2\2\31\u0149\3\2\2\2\33\u0151\3\2\2\2\35\u0154\3"+
"\2\2\2\37\u0159\3\2\2\2!\u015e\3\2\2\2#\u0166\3\2\2\2%\u016f\3\2\2\2\'"+
"\u0177\3\2\2\2)\u017f\3\2\2\2+\u018c\3\2\2\2-\u0199\3\2\2\2/\u01ab\3\2"+
"\2\2\61\u01af\3\2\2\2\63\u01b4\3\2\2\2\65\u01ba\3\2\2\2\67\u01bf\3\2\2"+
"\29\u01c8\3\2\2\2;\u01d1\3\2\2\2=\u01d6\3\2\2\2?\u01da\3\2\2\2A\u01e1"+
"\3\2\2\2C\u01ec\3\2\2\2E\u01f3\3\2\2\2G\u01fb\3\2\2\2I\u0203\3\2\2\2K"+
"\u0209\3\2\2\2M\u020f\3\2\2\2O\u0213\3\2\2\2Q\u021a\3\2\2\2S\u021f\3\2"+
"\2\2U\u0226\3\2\2\2W\u022b\3\2\2\2Y\u0235\3\2\2\2[\u023e\3\2\2\2]\u0244"+
"\3\2\2\2_\u024b\3\2\2\2a\u0250\3\2\2\2c\u0256\3\2\2\2e\u0259\3\2\2\2g"+
"\u0261\3\2\2\2i\u0267\3\2\2\2k\u0270\3\2\2\2m\u0273\3\2\2\2o\u0278\3\2"+
"\2\2q\u027d\3\2\2\2s\u0282\3\2\2\2u\u0287\3\2\2\2w\u028d\3\2\2\2y\u0294"+
"\3\2\2\2{\u029a\3\2\2\2}\u02a1\3\2\2\2\177\u02a9\3\2\2\2\u0081\u02af\3"+
"\2\2\2\u0083\u02b6\3\2\2\2\u0085\u02be\3\2\2\2\u0087\u02c2\3\2\2\2\u0089"+
"\u02c7\3\2\2\2\u008b\u02cd\3\2\2\2\u008d\u02d0\3\2\2\2\u008f\u02da\3\2"+
"\2\2\u0091\u02dd\3\2\2\2\u0093\u02e3\3\2\2\2\u0095\u02e9\3\2\2\2\u0097"+
"\u02f0\3\2\2\2\u0099\u02f9\3\2\2\2\u009b\u02ff\3\2\2\2\u009d\u0304\3\2"+
"\2\2\u009f\u030a\3\2\2\2\u00a1\u0310\3\2\2\2\u00a3\u0316\3\2\2\2\u00a5"+
"\u031e\3\2\2\2\u00a7\u0325\3\2\2\2\u00a9\u032d\3\2\2\2\u00ab\u0334\3\2"+
"\2\2\u00ad\u0339\3\2\2\2\u00af\u033d\3\2\2\2\u00b1\u0343\3\2\2\2\u00b3"+
"\u034a\3\2\2\2\u00b5\u034f\3\2\2\2\u00b7\u0354\3\2\2\2\u00b9\u0359\3\2"+
"\2\2\u00bb\u035c\3\2\2\2\u00bd\u0361\3\2\2\2\u00bf\u0367\3\2\2\2\u00c1"+
"\u036d\3\2\2\2\u00c3\u0374\3\2\2\2\u00c5\u0379\3\2\2\2\u00c7\u037f\3\2"+
"\2\2\u00c9\u0384\3\2\2\2\u00cb\u0389\3\2\2\2\u00cd\u038f\3\2\2\2\u00cf"+
"\u0397\3\2\2\2\u00d1\u039b\3\2\2\2\u00d3\u03a2\3\2\2\2\u00d5\u03a5\3\2"+
"\2\2\u00d7\u03a8\3\2\2\2\u00d9\u03ac\3\2\2\2\u00db\u03b2\3\2\2\2\u00dd"+
"\u03b9\3\2\2\2\u00df\u03bb\3\2\2\2\u00e1\u03bd\3\2\2\2\u00e3\u03c5\3\2"+
"\2\2\u00e5\u03c7\3\2\2\2\u00e7\u03c9\3\2\2\2\u00e9\u03cc\3\2\2\2\u00eb"+
"\u03ce\3\2\2\2\u00ed\u03d1\3\2\2\2\u00ef\u03d3\3\2\2\2\u00f1\u03d5\3\2"+
"\2\2\u00f3\u03d7\3\2\2\2\u00f5\u03d9\3\2\2\2\u00f7\u03db\3\2\2\2\u00f9"+
"\u03de\3\2\2\2\u00fb\u03e1\3\2\2\2\u00fd\u03e3\3\2\2\2\u00ff\u03e5\3\2"+
"\2\2\u0101\u03f1\3\2\2\2\u0103\u041f\3\2\2\2\u0105\u0423\3\2\2\2\u0107"+
"\u042d\3\2\2\2\u0109\u0438\3\2\2\2\u010b\u043c\3\2\2\2\u010d\u0447\3\2"+
"\2\2\u010f\u0452\3\2\2\2\u0111\u045b\3\2\2\2\u0113\u045d\3\2\2\2\u0115"+
"\u045f\3\2\2\2\u0117\u0470\3\2\2\2\u0119\u0480\3\2\2\2\u011b\u0486\3\2"+
"\2\2\u011d\u011e\7*\2\2\u011e\4\3\2\2\2\u011f\u0120\7+\2\2\u0120\6\3\2"+
"\2\2\u0121\u0122\7.\2\2\u0122\b\3\2\2\2\u0123\u0124\7<\2\2\u0124\n\3\2"+
"\2\2\u0125\u0126\7C\2\2\u0126\u0127\7N\2\2\u0127\u0128\7N\2\2\u0128\f"+
"\3\2\2\2\u0129\u012a\7C\2\2\u012a\u012b\7P\2\2\u012b\u012c\7C\2\2\u012c"+
"\u012d\7N\2\2\u012d\u012e\7[\2\2\u012e\u012f\7\\\2\2\u012f\u0130\7G\2"+
"\2\u0130\16\3\2\2\2\u0131\u0132\7C\2\2\u0132\u0133\7P\2\2\u0133\u0134"+
"\7C\2\2\u0134\u0135\7N\2\2\u0135\u0136\7[\2\2\u0136\u0137\7\\\2\2\u0137"+
"\u0138\7G\2\2\u0138\u0139\7F\2\2\u0139\20\3\2\2\2\u013a\u013b\7C\2\2\u013b"+
"\u013c\7P\2\2\u013c\u013d\7F\2\2\u013d\22\3\2\2\2\u013e\u013f\7C\2\2\u013f"+
"\u0140\7P\2\2\u0140\u0141\7[\2\2\u0141\24\3\2\2\2\u0142\u0143\7C\2\2\u0143"+
"\u0144\7U\2\2\u0144\26\3\2\2\2\u0145\u0146\7C\2\2\u0146\u0147\7U\2\2\u0147"+
"\u0148\7E\2\2\u0148\30\3\2\2\2\u0149\u014a\7D\2\2\u014a\u014b\7G\2\2\u014b"+
"\u014c\7V\2\2\u014c\u014d\7Y\2\2\u014d\u014e\7G\2\2\u014e\u014f\7G\2\2"+
"\u014f\u0150\7P\2\2\u0150\32\3\2\2\2\u0151\u0152\7D\2\2\u0152\u0153\7"+
"[\2\2\u0153\34\3\2\2\2\u0154\u0155\7E\2\2\u0155\u0156\7C\2\2\u0156\u0157"+
"\7U\2\2\u0157\u0158\7G\2\2\u0158\36\3\2\2\2\u0159\u015a\7E\2\2\u015a\u015b"+
"\7C\2\2\u015b\u015c\7U\2\2\u015c\u015d\7V\2\2\u015d \3\2\2\2\u015e\u015f"+
"\7E\2\2\u015f\u0160\7C\2\2\u0160\u0161\7V\2\2\u0161\u0162\7C\2\2\u0162"+
"\u0163\7N\2\2\u0163\u0164\7Q\2\2\u0164\u0165\7I\2\2\u0165\"\3\2\2\2\u0166"+
"\u0167\7E\2\2\u0167\u0168\7C\2\2\u0168\u0169\7V\2\2\u0169\u016a\7C\2\2"+
"\u016a\u016b\7N\2\2\u016b\u016c\7Q\2\2\u016c\u016d\7I\2\2\u016d\u016e"+
"\7U\2\2\u016e$\3\2\2\2\u016f\u0170\7E\2\2\u0170\u0171\7Q\2\2\u0171\u0172"+
"\7N\2\2\u0172\u0173\7W\2\2\u0173\u0174\7O\2\2\u0174\u0175\7P\2\2\u0175"+
"\u0176\7U\2\2\u0176&\3\2\2\2\u0177\u0178\7E\2\2\u0178\u0179\7Q\2\2\u0179"+
"\u017a\7P\2\2\u017a\u017b\7X\2\2\u017b\u017c\7G\2\2\u017c\u017d\7T\2\2"+
"\u017d\u017e\7V\2\2\u017e(\3\2\2\2\u017f\u0180\7E\2\2\u0180\u0181\7W\2"+
"\2\u0181\u0182\7T\2\2\u0182\u0183\7T\2\2\u0183\u0184\7G\2\2\u0184\u0185"+
"\7P\2\2\u0185\u0186\7V\2\2\u0186\u0187\7a\2\2\u0187\u0188\7F\2\2\u0188"+
"\u0189\7C\2\2\u0189\u018a\7V\2\2\u018a\u018b\7G\2\2\u018b*\3\2\2\2\u018c"+
"\u018d\7E\2\2\u018d\u018e\7W\2\2\u018e\u018f\7T\2\2\u018f\u0190\7T\2\2"+
"\u0190\u0191\7G\2\2\u0191\u0192\7P\2\2\u0192\u0193\7V\2\2\u0193\u0194"+
"\7a\2\2\u0194\u0195\7V\2\2\u0195\u0196\7K\2\2\u0196\u0197\7O\2\2\u0197"+
"\u0198\7G\2\2\u0198,\3\2\2\2\u0199\u019a\7E\2\2\u019a\u019b\7W\2\2\u019b"+
"\u019c\7T\2\2\u019c\u019d\7T\2\2\u019d\u019e\7G\2\2\u019e\u019f\7P\2\2"+
"\u019f\u01a0\7V\2\2\u01a0\u01a1\7a\2\2\u01a1\u01a2\7V\2\2\u01a2\u01a3"+
"\7K\2\2\u01a3\u01a4\7O\2\2\u01a4\u01a5\7G\2\2\u01a5\u01a6\7U\2\2\u01a6"+
"\u01a7\7V\2\2\u01a7\u01a8\7C\2\2\u01a8\u01a9\7O\2\2\u01a9\u01aa\7R\2\2"+
"\u01aa.\3\2\2\2\u01ab\u01ac\7F\2\2\u01ac\u01ad\7C\2\2\u01ad\u01ae\7[\2"+
"\2\u01ae\60\3\2\2\2\u01af\u01b0\7F\2\2\u01b0\u01b1\7C\2\2\u01b1\u01b2"+
"\7[\2\2\u01b2\u01b3\7U\2\2\u01b3\62\3\2\2\2\u01b4\u01b5\7F\2\2\u01b5\u01b6"+
"\7G\2\2\u01b6\u01b7\7D\2\2\u01b7\u01b8\7W\2\2\u01b8\u01b9\7I\2\2\u01b9"+
"\64\3\2\2\2\u01ba\u01bb\7F\2\2\u01bb\u01bc\7G\2\2\u01bc\u01bd\7U\2\2\u01bd"+
"\u01be\7E\2\2\u01be\66\3\2\2\2\u01bf\u01c0\7F\2\2\u01c0\u01c1\7G\2\2\u01c1"+
"\u01c2\7U\2\2\u01c2\u01c3\7E\2\2\u01c3\u01c4\7T\2\2\u01c4\u01c5\7K\2\2"+
"\u01c5\u01c6\7D\2\2\u01c6\u01c7\7G\2\2\u01c78\3\2\2\2\u01c8\u01c9\7F\2"+
"\2\u01c9\u01ca\7K\2\2\u01ca\u01cb\7U\2\2\u01cb\u01cc\7V\2\2\u01cc\u01cd"+
"\7K\2\2\u01cd\u01ce\7P\2\2\u01ce\u01cf\7E\2\2\u01cf\u01d0\7V\2\2\u01d0"+
":\3\2\2\2\u01d1\u01d2\7G\2\2\u01d2\u01d3\7N\2\2\u01d3\u01d4\7U\2\2\u01d4"+
"\u01d5\7G\2\2\u01d5<\3\2\2\2\u01d6\u01d7\7G\2\2\u01d7\u01d8\7P\2\2\u01d8"+
"\u01d9\7F\2\2\u01d9>\3\2\2\2\u01da\u01db\7G\2\2\u01db\u01dc\7U\2\2\u01dc"+
"\u01dd\7E\2\2\u01dd\u01de\7C\2\2\u01de\u01df\7R\2\2\u01df\u01e0\7G\2\2"+
"\u01e0@\3\2\2\2\u01e1\u01e2\7G\2\2\u01e2\u01e3\7Z\2\2\u01e3\u01e4\7G\2"+
"\2\u01e4\u01e5\7E\2\2\u01e5\u01e6\7W\2\2\u01e6\u01e7\7V\2\2\u01e7\u01e8"+
"\7C\2\2\u01e8\u01e9\7D\2\2\u01e9\u01ea\7N\2\2\u01ea\u01eb\7G\2\2\u01eb"+
"B\3\2\2\2\u01ec\u01ed\7G\2\2\u01ed\u01ee\7Z\2\2\u01ee\u01ef\7K\2\2\u01ef"+
"\u01f0\7U\2\2\u01f0\u01f1\7V\2\2\u01f1\u01f2\7U\2\2\u01f2D\3\2\2\2\u01f3"+
"\u01f4\7G\2\2\u01f4\u01f5\7Z\2\2\u01f5\u01f6\7R\2\2\u01f6\u01f7\7N\2\2"+
"\u01f7\u01f8\7C\2\2\u01f8\u01f9\7K\2\2\u01f9\u01fa\7P\2\2\u01faF\3\2\2"+
"\2\u01fb\u01fc\7G\2\2\u01fc\u01fd\7Z\2\2\u01fd\u01fe\7V\2\2\u01fe\u01ff"+
"\7T\2\2\u01ff\u0200\7C\2\2\u0200\u0201\7E\2\2\u0201\u0202\7V\2\2\u0202"+
"H\3\2\2\2\u0203\u0204\7H\2\2\u0204\u0205\7C\2\2\u0205\u0206\7N\2\2\u0206"+
"\u0207\7U\2\2\u0207\u0208\7G\2\2\u0208J\3\2\2\2\u0209\u020a\7H\2\2\u020a"+
"\u020b\7K\2\2\u020b\u020c\7T\2\2\u020c\u020d\7U\2\2\u020d\u020e\7V\2\2"+
"\u020eL\3\2\2\2\u020f\u0210\7H\2\2\u0210\u0211\7Q\2\2\u0211\u0212\7T\2"+
"\2\u0212N\3\2\2\2\u0213\u0214\7H\2\2\u0214\u0215\7Q\2\2\u0215\u0216\7"+
"T\2\2\u0216\u0217\7O\2\2\u0217\u0218\7C\2\2\u0218\u0219\7V\2\2\u0219P"+
"\3\2\2\2\u021a\u021b\7H\2\2\u021b\u021c\7T\2\2\u021c\u021d\7Q\2\2\u021d"+
"\u021e\7O\2\2\u021eR\3\2\2\2\u021f\u0220\7H\2\2\u0220\u0221\7T\2\2\u0221"+
"\u0222\7Q\2\2\u0222\u0223\7\\\2\2\u0223\u0224\7G\2\2\u0224\u0225\7P\2"+
"\2\u0225T\3\2\2\2\u0226\u0227\7H\2\2\u0227\u0228\7W\2\2\u0228\u0229\7"+
"N\2\2\u0229\u022a\7N\2\2\u022aV\3\2\2\2\u022b\u022c\7H\2\2\u022c\u022d"+
"\7W\2\2\u022d\u022e\7P\2\2\u022e\u022f\7E\2\2\u022f\u0230\7V\2\2\u0230"+
"\u0231\7K\2\2\u0231\u0232\7Q\2\2\u0232\u0233\7P\2\2\u0233\u0234\7U\2\2"+
"\u0234X\3\2\2\2\u0235\u0236\7I\2\2\u0236\u0237\7T\2\2\u0237\u0238\7C\2"+
"\2\u0238\u0239\7R\2\2\u0239\u023a\7J\2\2\u023a\u023b\7X\2\2\u023b\u023c"+
"\7K\2\2\u023c\u023d\7\\\2\2\u023dZ\3\2\2\2\u023e\u023f\7I\2\2\u023f\u0240"+
"\7T\2\2\u0240\u0241\7Q\2\2\u0241\u0242\7W\2\2\u0242\u0243\7R\2\2\u0243"+
"\\\3\2\2\2\u0244\u0245\7J\2\2\u0245\u0246\7C\2\2\u0246\u0247\7X\2\2\u0247"+
"\u0248\7K\2\2\u0248\u0249\7P\2\2\u0249\u024a\7I\2\2\u024a^\3\2\2\2\u024b"+
"\u024c\7J\2\2\u024c\u024d\7Q\2\2\u024d\u024e\7W\2\2\u024e\u024f\7T\2\2"+
"\u024f`\3\2\2\2\u0250\u0251\7J\2\2\u0251\u0252\7Q\2\2\u0252\u0253\7W\2"+
"\2\u0253\u0254\7T\2\2\u0254\u0255\7U\2\2\u0255b\3\2\2\2\u0256\u0257\7"+
"K\2\2\u0257\u0258\7P\2\2\u0258d\3\2\2\2\u0259\u025a\7K\2\2\u025a\u025b"+
"\7P\2\2\u025b\u025c\7E\2\2\u025c\u025d\7N\2\2\u025d\u025e\7W\2\2\u025e"+
"\u025f\7F\2\2\u025f\u0260\7G\2\2\u0260f\3\2\2\2\u0261\u0262\7K\2\2\u0262"+
"\u0263\7P\2\2\u0263\u0264\7P\2\2\u0264\u0265\7G\2\2\u0265\u0266\7T\2\2"+
"\u0266h\3\2\2\2\u0267\u0268\7K\2\2\u0268\u0269\7P\2\2\u0269\u026a\7V\2"+
"\2\u026a\u026b\7G\2\2\u026b\u026c\7T\2\2\u026c\u026d\7X\2\2\u026d\u026e"+
"\7C\2\2\u026e\u026f\7N\2\2\u026fj\3\2\2\2\u0270\u0271\7K\2\2\u0271\u0272"+
"\7U\2\2\u0272l\3\2\2\2\u0273\u0274\7L\2\2\u0274\u0275\7Q\2\2\u0275\u0276"+
"\7K\2\2\u0276\u0277\7P\2\2\u0277n\3\2\2\2\u0278\u0279\7N\2\2\u0279\u027a"+
"\7C\2\2\u027a\u027b\7U\2\2\u027b\u027c\7V\2\2\u027cp\3\2\2\2\u027d\u027e"+
"\7N\2\2\u027e\u027f\7G\2\2\u027f\u0280\7H\2\2\u0280\u0281\7V\2\2\u0281"+
"r\3\2\2\2\u0282\u0283\7N\2\2\u0283\u0284\7K\2\2\u0284\u0285\7M\2\2\u0285"+
"\u0286\7G\2\2\u0286t\3\2\2\2\u0287\u0288\7N\2\2\u0288\u0289\7K\2\2\u0289"+
"\u028a\7O\2\2\u028a\u028b\7K\2\2\u028b\u028c\7V\2\2\u028cv\3\2\2\2\u028d"+
"\u028e\7O\2\2\u028e\u028f\7C\2\2\u028f\u0290\7R\2\2\u0290\u0291\7R\2\2"+
"\u0291\u0292\7G\2\2\u0292\u0293\7F\2\2\u0293x\3\2\2\2\u0294\u0295\7O\2"+
"\2\u0295\u0296\7C\2\2\u0296\u0297\7V\2\2\u0297\u0298\7E\2\2\u0298\u0299"+
"\7J\2\2\u0299z\3\2\2\2\u029a\u029b\7O\2\2\u029b\u029c\7K\2\2\u029c\u029d"+
"\7P\2\2\u029d\u029e\7W\2\2\u029e\u029f\7V\2\2\u029f\u02a0\7G\2\2\u02a0"+
"|\3\2\2\2\u02a1\u02a2\7O\2\2\u02a2\u02a3\7K\2\2\u02a3\u02a4\7P\2\2\u02a4"+
"\u02a5\7W\2\2\u02a5\u02a6\7V\2\2\u02a6\u02a7\7G\2\2\u02a7\u02a8\7U\2\2"+
"\u02a8~\3\2\2\2\u02a9\u02aa\7O\2\2\u02aa\u02ab\7Q\2\2\u02ab\u02ac\7P\2"+
"\2\u02ac\u02ad\7V\2\2\u02ad\u02ae\7J\2\2\u02ae\u0080\3\2\2\2\u02af\u02b0"+
"\7O\2\2\u02b0\u02b1\7Q\2\2\u02b1\u02b2\7P\2\2\u02b2\u02b3\7V\2\2\u02b3"+
"\u02b4\7J\2\2\u02b4\u02b5\7U\2\2\u02b5\u0082\3\2\2\2\u02b6\u02b7\7P\2"+
"\2\u02b7\u02b8\7C\2\2\u02b8\u02b9\7V\2\2\u02b9\u02ba\7W\2\2\u02ba\u02bb"+
"\7T\2\2\u02bb\u02bc\7C\2\2\u02bc\u02bd\7N\2\2\u02bd\u0084\3\2\2\2\u02be"+
"\u02bf\7P\2\2\u02bf\u02c0\7Q\2\2\u02c0\u02c1\7V\2\2\u02c1\u0086\3\2\2"+
"\2\u02c2\u02c3\7P\2\2\u02c3\u02c4\7W\2\2\u02c4\u02c5\7N\2\2\u02c5\u02c6"+
"\7N\2\2\u02c6\u0088\3\2\2\2\u02c7\u02c8\7P\2\2\u02c8\u02c9\7W\2\2\u02c9"+
"\u02ca\7N\2\2\u02ca\u02cb\7N\2\2\u02cb\u02cc\7U\2\2\u02cc\u008a\3\2\2"+
"\2\u02cd\u02ce\7Q\2\2\u02ce\u02cf\7P\2\2\u02cf\u008c\3\2\2\2\u02d0\u02d1"+
"\7Q\2\2\u02d1\u02d2\7R\2\2\u02d2\u02d3\7V\2\2\u02d3\u02d4\7K\2\2\u02d4"+
"\u02d5\7O\2\2\u02d5\u02d6\7K\2\2\u02d6\u02d7\7\\\2\2\u02d7\u02d8\7G\2"+
"\2\u02d8\u02d9\7F\2\2\u02d9\u008e\3\2\2\2\u02da\u02db\7Q\2\2\u02db\u02dc"+
"\7T\2\2\u02dc\u0090\3\2\2\2\u02dd\u02de\7Q\2\2\u02de\u02df\7T\2\2\u02df"+
"\u02e0\7F\2\2\u02e0\u02e1\7G\2\2\u02e1\u02e2\7T\2\2\u02e2\u0092\3\2\2"+
"\2\u02e3\u02e4\7Q\2\2\u02e4\u02e5\7W\2\2\u02e5\u02e6\7V\2\2\u02e6\u02e7"+
"\7G\2\2\u02e7\u02e8\7T\2\2\u02e8\u0094\3\2\2\2\u02e9\u02ea\7R\2\2\u02ea"+
"\u02eb\7C\2\2\u02eb\u02ec\7T\2\2\u02ec\u02ed\7U\2\2\u02ed\u02ee\7G\2\2"+
"\u02ee\u02ef\7F\2\2\u02ef\u0096\3\2\2\2\u02f0\u02f1\7R\2\2\u02f1\u02f2"+
"\7J\2\2\u02f2\u02f3\7[\2\2\u02f3\u02f4\7U\2\2\u02f4\u02f5\7K\2\2\u02f5"+
"\u02f6\7E\2\2\u02f6\u02f7\7C\2\2\u02f7\u02f8\7N\2\2\u02f8\u0098\3\2\2"+
"\2\u02f9\u02fa\7R\2\2\u02fa\u02fb\7K\2\2\u02fb\u02fc\7X\2\2\u02fc\u02fd"+
"\7Q\2\2\u02fd\u02fe\7V\2\2\u02fe\u009a\3\2\2\2\u02ff\u0300\7R\2\2\u0300"+
"\u0301\7N\2\2\u0301\u0302\7C\2\2\u0302\u0303\7P\2\2\u0303\u009c\3\2\2"+
"\2\u0304\u0305\7T\2\2\u0305\u0306\7K\2\2\u0306\u0307\7I\2\2\u0307\u0308"+
"\7J\2\2\u0308\u0309\7V\2\2\u0309\u009e\3\2\2\2\u030a\u030b\7T\2\2\u030b"+
"\u030c\7N\2\2\u030c\u030d\7K\2\2\u030d\u030e\7M\2\2\u030e\u030f\7G\2\2"+
"\u030f\u00a0\3\2\2\2\u0310\u0311\7S\2\2\u0311\u0312\7W\2\2\u0312\u0313"+
"\7G\2\2\u0313\u0314\7T\2\2\u0314\u0315\7[\2\2\u0315\u00a2\3\2\2\2\u0316"+
"\u0317\7U\2\2\u0317\u0318\7E\2\2\u0318\u0319\7J\2\2\u0319\u031a\7G\2\2"+
"\u031a\u031b\7O\2\2\u031b\u031c\7C\2\2\u031c\u031d\7U\2\2\u031d\u00a4"+
"\3\2\2\2\u031e\u031f\7U\2\2\u031f\u0320\7G\2\2\u0320\u0321\7E\2\2\u0321"+
"\u0322\7Q\2\2\u0322\u0323\7P\2\2\u0323\u0324\7F\2\2\u0324\u00a6\3\2\2"+
"\2\u0325\u0326\7U\2\2\u0326\u0327\7G\2\2\u0327\u0328\7E\2\2\u0328\u0329"+
"\7Q\2\2\u0329\u032a\7P\2\2\u032a\u032b\7F\2\2\u032b\u032c\7U\2\2\u032c"+
"\u00a8\3\2\2\2\u032d\u032e\7U\2\2\u032e\u032f\7G\2\2\u032f\u0330\7N\2"+
"\2\u0330\u0331\7G\2\2\u0331\u0332\7E\2\2\u0332\u0333\7V\2\2\u0333\u00aa"+
"\3\2\2\2\u0334\u0335\7U\2\2\u0335\u0336\7J\2\2\u0336\u0337\7Q\2\2\u0337"+
"\u0338\7Y\2\2\u0338\u00ac\3\2\2\2\u0339\u033a\7U\2\2\u033a\u033b\7[\2"+
"\2\u033b\u033c\7U\2\2\u033c\u00ae\3\2\2\2\u033d\u033e\7V\2\2\u033e\u033f"+
"\7C\2\2\u033f\u0340\7D\2\2\u0340\u0341\7N\2\2\u0341\u0342\7G\2\2\u0342"+
"\u00b0\3\2\2\2\u0343\u0344\7V\2\2\u0344\u0345\7C\2\2\u0345\u0346\7D\2"+
"\2\u0346\u0347\7N\2\2\u0347\u0348\7G\2\2\u0348\u0349\7U\2\2\u0349\u00b2"+
"\3\2\2\2\u034a\u034b\7V\2\2\u034b\u034c\7G\2\2\u034c\u034d\7Z\2\2\u034d"+
"\u034e\7V\2\2\u034e\u00b4\3\2\2\2\u034f\u0350\7V\2\2\u0350\u0351\7J\2"+
"\2\u0351\u0352\7G\2\2\u0352\u0353\7P\2\2\u0353\u00b6\3\2\2\2\u0354\u0355"+
"\7V\2\2\u0355\u0356\7T\2\2\u0356\u0357\7W\2\2\u0357\u0358\7G\2\2\u0358"+
"\u00b8\3\2\2\2\u0359\u035a\7V\2\2\u035a\u035b\7Q\2\2\u035b\u00ba\3\2\2"+
"\2\u035c\u035d\7V\2\2\u035d\u035e\7[\2\2\u035e\u035f\7R\2\2\u035f\u0360"+
"\7G\2\2\u0360\u00bc\3\2\2\2\u0361\u0362\7V\2\2\u0362\u0363\7[\2\2\u0363"+
"\u0364\7R\2\2\u0364\u0365\7G\2\2\u0365\u0366\7U\2\2\u0366\u00be\3\2\2"+
"\2\u0367\u0368\7W\2\2\u0368\u0369\7U\2\2\u0369\u036a\7K\2\2\u036a\u036b"+
"\7P\2\2\u036b\u036c\7I\2\2\u036c\u00c0\3\2\2\2\u036d\u036e\7X\2\2\u036e"+
"\u036f\7G\2\2\u036f\u0370\7T\2\2\u0370\u0371\7K\2\2\u0371\u0372\7H\2\2"+
"\u0372\u0373\7[\2\2\u0373\u00c2\3\2\2\2\u0374\u0375\7Y\2\2\u0375\u0376"+
"\7J\2\2\u0376\u0377\7G\2\2\u0377\u0378\7P\2\2\u0378\u00c4\3\2\2\2\u0379"+
"\u037a\7Y\2\2\u037a\u037b\7J\2\2\u037b\u037c\7G\2\2\u037c\u037d\7T\2\2"+
"\u037d\u037e\7G\2\2\u037e\u00c6\3\2\2\2\u037f\u0380\7Y\2\2\u0380\u0381"+
"\7K\2\2\u0381\u0382\7V\2\2\u0382\u0383\7J\2\2\u0383\u00c8\3\2\2\2\u0384"+
"\u0385\7[\2\2\u0385\u0386\7G\2\2\u0386\u0387\7C\2\2\u0387\u0388\7T\2\2"+
"\u0388\u00ca\3\2\2\2\u0389\u038a\7[\2\2\u038a\u038b\7G\2\2\u038b\u038c"+
"\7C\2\2\u038c\u038d\7T\2\2\u038d\u038e\7U\2\2\u038e\u00cc\3\2\2\2\u038f"+
"\u0390\5\u00dbn\2\u0390\u0391\7G\2\2\u0391\u0392\7U\2\2\u0392\u0393\7"+
"E\2\2\u0393\u0394\7C\2\2\u0394\u0395\7R\2\2\u0395\u0396\7G\2\2\u0396\u00ce"+
"\3\2\2\2\u0397\u0398\5\u00dbn\2\u0398\u0399\7H\2\2\u0399\u039a\7P\2\2"+
"\u039a\u00d0\3\2\2\2\u039b\u039c\5\u00dbn\2\u039c\u039d\7N\2\2\u039d\u039e"+
"\7K\2\2\u039e\u039f\7O\2\2\u039f\u03a0\7K\2\2\u03a0\u03a1\7V\2\2\u03a1"+
"\u00d2\3\2\2\2\u03a2\u03a3\5\u00dbn\2\u03a3\u03a4\7F\2\2\u03a4\u00d4\3"+
"\2\2\2\u03a5\u03a6\5\u00dbn\2\u03a6\u03a7\7V\2\2\u03a7\u00d6\3\2\2\2\u03a8"+
"\u03a9\5\u00dbn\2\u03a9\u03aa\7V\2\2\u03aa\u03ab\7U\2\2\u03ab\u00d8\3"+
"\2\2\2\u03ac\u03ad\5\u00dbn\2\u03ad\u03ae\7I\2\2\u03ae\u03af\7W\2\2\u03af"+
"\u03b0\7K\2\2\u03b0\u03b1\7F\2\2\u03b1\u00da\3\2\2\2\u03b2\u03b6\7}\2"+
"\2\u03b3\u03b5\5\u0119\u008d\2\u03b4\u03b3\3\2\2\2\u03b5\u03b8\3\2\2\2"+
"\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7\u00dc\3\2\2\2\u03b8\u03b6"+
"\3\2\2\2\u03b9\u03ba\7\177\2\2\u03ba\u00de\3\2\2\2\u03bb\u03bc\7?\2\2"+
"\u03bc\u00e0\3\2\2\2\u03bd\u03be\7>\2\2\u03be\u03bf\7?\2\2\u03bf\u03c0"+
"\7@\2\2\u03c0\u00e2\3\2\2\2\u03c1\u03c2\7>\2\2\u03c2\u03c6\7@\2\2\u03c3"+
"\u03c4\7#\2\2\u03c4\u03c6\7?\2\2\u03c5\u03c1\3\2\2\2\u03c5\u03c3\3\2\2"+
"\2\u03c6\u00e4\3\2\2\2\u03c7\u03c8\7>\2\2\u03c8\u00e6\3\2\2\2\u03c9\u03ca"+
"\7>\2\2\u03ca\u03cb\7?\2\2\u03cb\u00e8\3\2\2\2\u03cc\u03cd\7@\2\2\u03cd"+
"\u00ea\3\2\2\2\u03ce\u03cf\7@\2\2\u03cf\u03d0\7?\2\2\u03d0\u00ec\3\2\2"+
"\2\u03d1\u03d2\7-\2\2\u03d2\u00ee\3\2\2\2\u03d3\u03d4\7/\2\2\u03d4\u00f0"+
"\3\2\2\2\u03d5\u03d6\7,\2\2\u03d6\u00f2\3\2\2\2\u03d7\u03d8\7\61\2\2\u03d8"+
"\u00f4\3\2\2\2\u03d9\u03da\7\'\2\2\u03da\u00f6\3\2\2\2\u03db\u03dc\7<"+
"\2\2\u03dc\u03dd\7<\2\2\u03dd\u00f8\3\2\2\2\u03de\u03df\7~\2\2\u03df\u03e0"+
"\7~\2\2\u03e0\u00fa\3\2\2\2\u03e1\u03e2\7\60\2\2\u03e2\u00fc\3\2\2\2\u03e3"+
"\u03e4\7A\2\2\u03e4\u00fe\3\2\2\2\u03e5\u03eb\7)\2\2\u03e6\u03ea\n\2\2"+
"\2\u03e7\u03e8\7)\2\2\u03e8\u03ea\7)\2\2\u03e9\u03e6\3\2\2\2\u03e9\u03e7"+
"\3\2\2\2\u03ea\u03ed\3\2\2\2\u03eb\u03e9\3\2\2\2\u03eb\u03ec\3\2\2\2\u03ec"+
"\u03ee\3\2\2\2\u03ed\u03eb\3\2\2\2\u03ee\u03ef\7)\2\2\u03ef\u0100\3\2"+
"\2\2\u03f0\u03f2\5\u0111\u0089\2\u03f1\u03f0\3\2\2\2\u03f2\u03f3\3\2\2"+
"\2\u03f3\u03f1\3\2\2\2\u03f3\u03f4\3\2\2\2\u03f4\u0102\3\2\2\2\u03f5\u03f7"+
"\5\u0111\u0089\2\u03f6\u03f5\3\2\2\2\u03f7\u03f8\3\2\2\2\u03f8\u03f6\3"+
"\2\2\2\u03f8\u03f9\3\2\2\2\u03f9\u03fa\3\2\2\2\u03fa\u03fe\5\u00fb~\2"+
"\u03fb\u03fd\5\u0111\u0089\2\u03fc\u03fb\3\2\2\2\u03fd\u0400\3\2\2\2\u03fe"+
"\u03fc\3\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u0420\3\2\2\2\u0400\u03fe\3\2"+
"\2\2\u0401\u0403\5\u00fb~\2\u0402\u0404\5\u0111\u0089\2\u0403\u0402\3"+
"\2\2\2\u0404\u0405\3\2\2\2\u0405\u0403\3\2\2\2\u0405\u0406\3\2\2\2\u0406"+
"\u0420\3\2\2\2\u0407\u0409\5\u0111\u0089\2\u0408\u0407\3\2\2\2\u0409\u040a"+
"\3\2\2\2\u040a\u0408\3\2\2\2\u040a\u040b\3\2\2\2\u040b\u0413\3\2\2\2\u040c"+
"\u0410\5\u00fb~\2\u040d\u040f\5\u0111\u0089\2\u040e\u040d\3\2\2\2\u040f"+
"\u0412\3\2\2\2\u0410\u040e\3\2\2\2\u0410\u0411\3\2\2\2\u0411\u0414\3\2"+
"\2\2\u0412\u0410\3\2\2\2\u0413\u040c\3\2\2\2\u0413\u0414\3\2\2\2\u0414"+
"\u0415\3\2\2\2\u0415\u0416\5\u010f\u0088\2\u0416\u0420\3\2\2\2\u0417\u0419"+
"\5\u00fb~\2\u0418\u041a\5\u0111\u0089\2\u0419\u0418\3\2\2\2\u041a\u041b"+
"\3\2\2\2\u041b\u0419\3\2\2\2\u041b\u041c\3\2\2\2\u041c\u041d\3\2\2\2\u041d"+
"\u041e\5\u010f\u0088\2\u041e\u0420\3\2\2\2\u041f\u03f6\3\2\2\2\u041f\u0401"+
"\3\2\2\2\u041f\u0408\3\2\2\2\u041f\u0417\3\2\2\2\u0420\u0104\3\2\2\2\u0421"+
"\u0424\5\u0113\u008a\2\u0422\u0424\7a\2\2\u0423\u0421\3\2\2\2\u0423\u0422"+
"\3\2\2\2\u0424\u042a\3\2\2\2\u0425\u0429\5\u0113\u008a\2\u0426\u0429\5"+
"\u0111\u0089\2\u0427\u0429\t\3\2\2\u0428\u0425\3\2\2\2\u0428\u0426\3\2"+
"\2\2\u0428\u0427\3\2\2\2\u0429\u042c\3\2\2\2\u042a\u0428\3\2\2\2\u042a"+
"\u042b\3\2\2\2\u042b\u0106\3\2\2\2\u042c\u042a\3\2\2\2\u042d\u0431\5\u0111"+
"\u0089\2\u042e\u0432\5\u0113\u008a\2\u042f\u0432\5\u0111\u0089\2\u0430"+
"\u0432\t\3\2\2\u0431\u042e\3\2\2\2\u0431\u042f\3\2\2\2\u0431\u0430\3\2"+
"\2\2\u0432\u0433\3\2\2\2\u0433\u0431\3\2\2\2\u0433\u0434\3\2\2\2\u0434"+
"\u0108\3\2\2\2\u0435\u0439\5\u0113\u008a\2\u0436\u0439\5\u0111\u0089\2"+
"\u0437\u0439\7a\2\2\u0438\u0435\3\2\2\2\u0438\u0436\3\2\2\2\u0438\u0437"+
"\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u0438\3\2\2\2\u043a\u043b\3\2\2\2\u043b"+
"\u010a\3\2\2\2\u043c\u0442\7$\2\2\u043d\u0441\n\4\2\2\u043e\u043f\7$\2"+
"\2\u043f\u0441\7$\2\2\u0440\u043d\3\2\2\2\u0440\u043e\3\2\2\2\u0441\u0444"+
"\3\2\2\2\u0442\u0440\3\2\2\2\u0442\u0443\3\2\2\2\u0443\u0445\3\2\2\2\u0444"+
"\u0442\3\2\2\2\u0445\u0446\7$\2\2\u0446\u010c\3\2\2\2\u0447\u044d\7b\2"+
"\2\u0448\u044c\n\5\2\2\u0449\u044a\7b\2\2\u044a\u044c\7b\2\2\u044b\u0448"+
"\3\2\2\2\u044b\u0449\3\2\2\2\u044c\u044f\3\2\2\2\u044d\u044b\3\2\2\2\u044d"+
"\u044e\3\2\2\2\u044e\u0450\3\2\2\2\u044f\u044d\3\2\2\2\u0450\u0451\7b"+
"\2\2\u0451\u010e\3\2\2\2\u0452\u0454\7G\2\2\u0453\u0455\t\6\2\2\u0454"+
"\u0453\3\2\2\2\u0454\u0455\3\2\2\2\u0455\u0457\3\2\2\2\u0456\u0458\5\u0111"+
"\u0089\2\u0457\u0456\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u0457\3\2\2\2\u0459"+
"\u045a\3\2\2\2\u045a\u0110\3\2\2\2\u045b\u045c\t\7\2\2\u045c\u0112\3\2"+
"\2\2\u045d\u045e\t\b\2\2\u045e\u0114\3\2\2\2\u045f\u0460\7/\2\2\u0460"+
"\u0461\7/\2\2\u0461\u0465\3\2\2\2\u0462\u0464\n\t\2\2\u0463\u0462\3\2"+
"\2\2\u0464\u0467\3\2\2\2\u0465\u0463\3\2\2\2\u0465\u0466\3\2\2\2\u0466"+
"\u0469\3\2\2\2\u0467\u0465\3\2\2\2\u0468\u046a\7\17\2\2\u0469\u0468\3"+
"\2\2\2\u0469\u046a\3\2\2\2\u046a\u046c\3\2\2\2\u046b\u046d\7\f\2\2\u046c"+
"\u046b\3\2\2\2\u046c\u046d\3\2\2\2\u046d\u046e\3\2\2\2\u046e\u046f\b\u008b"+
"\2\2\u046f\u0116\3\2\2\2\u0470\u0471\7\61\2\2\u0471\u0472\7,\2\2\u0472"+
"\u0477\3\2\2\2\u0473\u0476\5\u0117\u008c\2\u0474\u0476\13\2\2\2\u0475"+
"\u0473\3\2\2\2\u0475\u0474\3\2\2\2\u0476\u0479\3\2\2\2\u0477\u0478\3\2"+
"\2\2\u0477\u0475\3\2\2\2\u0478\u047a\3\2\2\2\u0479\u0477\3\2\2\2\u047a"+
"\u047b\7,\2\2\u047b\u047c\7\61\2\2\u047c\u047d\3\2\2\2\u047d\u047e\b\u008c"+
"\2\2\u047e\u0118\3\2\2\2\u047f\u0481\t\n\2\2\u0480\u047f\3\2\2\2\u0481"+
"\u0482\3\2\2\2\u0482\u0480\3\2\2\2\u0482\u0483\3\2\2\2\u0483\u0484\3\2"+
"\2\2\u0484\u0485\b\u008d\2\2\u0485\u011a\3\2\2\2\u0486\u0487\13\2\2\2"+
"\u0487\u011c\3\2\2\2#\2\u03b6\u03c5\u03e9\u03eb\u03f3\u03f8\u03fe\u0405"+
"\u040a\u0410\u0413\u041b\u041f\u0423\u0428\u042a\u0431\u0433\u0438\u043a"+
"\u0440\u0442\u044b\u044d\u0454\u0459\u0465\u0469\u046c\u0475\u0477\u0482"+
"\4\u008e\t\u008e\4\u008f\t\u008f\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3"+
"\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
"\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3"+
"\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17"+
"\3\17\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+
"\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23"+
"\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25"+
"\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26"+
"\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27"+
"\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30"+
"\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32"+
"\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
"\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36"+
"\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3"+
"!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3"+
"$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3"+
"(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3,\3"+
",\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3"+
".\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3"+
"\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3"+
"\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3"+
"\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\39\39\39\39\39\3"+
":\3:\3:\3:\3:\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=\3=\3"+
"=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3"+
"A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3D\3D\3D\3D\3D\3"+
"E\3E\3E\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3I\3"+
"I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3"+
"L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3"+
"P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3"+
"S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3"+
"W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3"+
"[\3[\3[\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3`\3`"+
"\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3d"+
"\3d\3d\3d\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3h\3h"+
"\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3j\3k\3k\3k\3l\3l\3l"+
"\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3o\3o\7o\u03bb\no\fo\16o\u03be\13o\3p\3"+
"p\3q\3q\3r\3r\3r\3r\3s\3s\3s\3s\5s\u03cc\ns\3t\3t\3u\3u\3u\3v\3v\3w\3"+
"w\3w\3x\3x\3y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3}\3~\3~\3~\3\177\3\177\3\u0080"+
"\3\u0080\3\u0081\3\u0081\3\u0081\3\u0081\7\u0081\u03f0\n\u0081\f\u0081"+
"\16\u0081\u03f3\13\u0081\3\u0081\3\u0081\3\u0082\6\u0082\u03f8\n\u0082"+
"\r\u0082\16\u0082\u03f9\3\u0083\6\u0083\u03fd\n\u0083\r\u0083\16\u0083"+
"\u03fe\3\u0083\3\u0083\7\u0083\u0403\n\u0083\f\u0083\16\u0083\u0406\13"+
"\u0083\3\u0083\3\u0083\6\u0083\u040a\n\u0083\r\u0083\16\u0083\u040b\3"+
"\u0083\6\u0083\u040f\n\u0083\r\u0083\16\u0083\u0410\3\u0083\3\u0083\7"+
"\u0083\u0415\n\u0083\f\u0083\16\u0083\u0418\13\u0083\5\u0083\u041a\n\u0083"+
"\3\u0083\3\u0083\3\u0083\3\u0083\6\u0083\u0420\n\u0083\r\u0083\16\u0083"+
"\u0421\3\u0083\3\u0083\5\u0083\u0426\n\u0083\3\u0084\3\u0084\5\u0084\u042a"+
"\n\u0084\3\u0084\3\u0084\3\u0084\7\u0084\u042f\n\u0084\f\u0084\16\u0084"+
"\u0432\13\u0084\3\u0085\3\u0085\3\u0085\3\u0085\6\u0085\u0438\n\u0085"+
"\r\u0085\16\u0085\u0439\3\u0086\3\u0086\3\u0086\6\u0086\u043f\n\u0086"+
"\r\u0086\16\u0086\u0440\3\u0087\3\u0087\3\u0087\3\u0087\7\u0087\u0447"+
"\n\u0087\f\u0087\16\u0087\u044a\13\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+
"\3\u0088\3\u0088\7\u0088\u0452\n\u0088\f\u0088\16\u0088\u0455\13\u0088"+
"\3\u0088\3\u0088\3\u0089\3\u0089\5\u0089\u045b\n\u0089\3\u0089\6\u0089"+
"\u045e\n\u0089\r\u0089\16\u0089\u045f\3\u008a\3\u008a\3\u008b\3\u008b"+
"\3\u008c\3\u008c\3\u008c\3\u008c\7\u008c\u046a\n\u008c\f\u008c\16\u008c"+
"\u046d\13\u008c\3\u008c\5\u008c\u0470\n\u008c\3\u008c\5\u008c\u0473\n"+
"\u008c\3\u008c\3\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008d\7\u008d"+
"\u047c\n\u008d\f\u008d\16\u008d\u047f\13\u008d\3\u008d\3\u008d\3\u008d"+
"\3\u008d\3\u008d\3\u008e\6\u008e\u0487\n\u008e\r\u008e\16\u008e\u0488"+
"\3\u008e\3\u008e\3\u008f\3\u008f\3\u047d\2\u0090\3\3\5\4\7\5\t\6\13\7"+
"\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25"+
")\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O"+
")Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081"+
"B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095"+
"L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9"+
"V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd"+
"`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1"+
"j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5"+
"t\u00e7u\u00e9v\u00ebw\u00edx\u00efy\u00f1z\u00f3{\u00f5|\u00f7}\u00f9"+
"~\u00fb\177\u00fd\u0080\u00ff\u0081\u0101\u0082\u0103\u0083\u0105\u0084"+
"\u0107\u0085\u0109\u0086\u010b\u0087\u010d\u0088\u010f\u0089\u0111\2\u0113"+
"\2\u0115\2\u0117\u008a\u0119\u008b\u011b\u008c\u011d\u008d\3\2\13\3\2"+
"))\4\2BBaa\3\2$$\3\2bb\4\2--//\3\2\62;\3\2C\\\4\2\f\f\17\17\5\2\13\f\17"+
"\17\"\"\u04af\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2"+
"\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2"+
"\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2"+
"\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2"+
"\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3"+
"\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2"+
"\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2"+
"S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3"+
"\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2"+
"\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2"+
"y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083"+
"\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2"+
"\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095"+
"\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2"+
"\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7"+
"\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2"+
"\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+
"\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+
"\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb"+
"\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2"+
"\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2\2\2\u00dd"+
"\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2"+
"\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef"+
"\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2"+
"\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2\2\2\u0101"+
"\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109\3\2\2"+
"\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0117\3\2\2\2\2\u0119"+
"\3\2\2\2\2\u011b\3\2\2\2\2\u011d\3\2\2\2\3\u011f\3\2\2\2\5\u0121\3\2\2"+
"\2\7\u0123\3\2\2\2\t\u0125\3\2\2\2\13\u0127\3\2\2\2\r\u012b\3\2\2\2\17"+
"\u0133\3\2\2\2\21\u013c\3\2\2\2\23\u0140\3\2\2\2\25\u0144\3\2\2\2\27\u0147"+
"\3\2\2\2\31\u014b\3\2\2\2\33\u0153\3\2\2\2\35\u0156\3\2\2\2\37\u015b\3"+
"\2\2\2!\u0160\3\2\2\2#\u0168\3\2\2\2%\u0171\3\2\2\2\'\u0179\3\2\2\2)\u0181"+
"\3\2\2\2+\u018e\3\2\2\2-\u019b\3\2\2\2/\u01ad\3\2\2\2\61\u01b1\3\2\2\2"+
"\63\u01b6\3\2\2\2\65\u01bc\3\2\2\2\67\u01c1\3\2\2\29\u01ca\3\2\2\2;\u01d3"+
"\3\2\2\2=\u01d8\3\2\2\2?\u01dc\3\2\2\2A\u01e3\3\2\2\2C\u01ee\3\2\2\2E"+
"\u01f5\3\2\2\2G\u01fd\3\2\2\2I\u0205\3\2\2\2K\u020b\3\2\2\2M\u0211\3\2"+
"\2\2O\u0215\3\2\2\2Q\u021c\3\2\2\2S\u0221\3\2\2\2U\u0228\3\2\2\2W\u022d"+
"\3\2\2\2Y\u0237\3\2\2\2[\u0240\3\2\2\2]\u0246\3\2\2\2_\u024d\3\2\2\2a"+
"\u0252\3\2\2\2c\u0258\3\2\2\2e\u025b\3\2\2\2g\u0263\3\2\2\2i\u0269\3\2"+
"\2\2k\u0272\3\2\2\2m\u0275\3\2\2\2o\u027a\3\2\2\2q\u027f\3\2\2\2s\u0284"+
"\3\2\2\2u\u0289\3\2\2\2w\u028f\3\2\2\2y\u0296\3\2\2\2{\u029c\3\2\2\2}"+
"\u02a3\3\2\2\2\177\u02ab\3\2\2\2\u0081\u02b1\3\2\2\2\u0083\u02b8\3\2\2"+
"\2\u0085\u02c0\3\2\2\2\u0087\u02c4\3\2\2\2\u0089\u02c9\3\2\2\2\u008b\u02cf"+
"\3\2\2\2\u008d\u02d2\3\2\2\2\u008f\u02dc\3\2\2\2\u0091\u02df\3\2\2\2\u0093"+
"\u02e5\3\2\2\2\u0095\u02eb\3\2\2\2\u0097\u02f2\3\2\2\2\u0099\u02fb\3\2"+
"\2\2\u009b\u0301\3\2\2\2\u009d\u0306\3\2\2\2\u009f\u030c\3\2\2\2\u00a1"+
"\u0312\3\2\2\2\u00a3\u0318\3\2\2\2\u00a5\u0320\3\2\2\2\u00a7\u0327\3\2"+
"\2\2\u00a9\u032f\3\2\2\2\u00ab\u0336\3\2\2\2\u00ad\u033b\3\2\2\2\u00af"+
"\u033f\3\2\2\2\u00b1\u0345\3\2\2\2\u00b3\u034c\3\2\2\2\u00b5\u0351\3\2"+
"\2\2\u00b7\u0356\3\2\2\2\u00b9\u035b\3\2\2\2\u00bb\u035e\3\2\2\2\u00bd"+
"\u0362\3\2\2\2\u00bf\u0367\3\2\2\2\u00c1\u036d\3\2\2\2\u00c3\u0373\3\2"+
"\2\2\u00c5\u037a\3\2\2\2\u00c7\u037f\3\2\2\2\u00c9\u0385\3\2\2\2\u00cb"+
"\u038a\3\2\2\2\u00cd\u038f\3\2\2\2\u00cf\u0395\3\2\2\2\u00d1\u039d\3\2"+
"\2\2\u00d3\u03a1\3\2\2\2\u00d5\u03a8\3\2\2\2\u00d7\u03ab\3\2\2\2\u00d9"+
"\u03ae\3\2\2\2\u00db\u03b2\3\2\2\2\u00dd\u03b8\3\2\2\2\u00df\u03bf\3\2"+
"\2\2\u00e1\u03c1\3\2\2\2\u00e3\u03c3\3\2\2\2\u00e5\u03cb\3\2\2\2\u00e7"+
"\u03cd\3\2\2\2\u00e9\u03cf\3\2\2\2\u00eb\u03d2\3\2\2\2\u00ed\u03d4\3\2"+
"\2\2\u00ef\u03d7\3\2\2\2\u00f1\u03d9\3\2\2\2\u00f3\u03db\3\2\2\2\u00f5"+
"\u03dd\3\2\2\2\u00f7\u03df\3\2\2\2\u00f9\u03e1\3\2\2\2\u00fb\u03e4\3\2"+
"\2\2\u00fd\u03e7\3\2\2\2\u00ff\u03e9\3\2\2\2\u0101\u03eb\3\2\2\2\u0103"+
"\u03f7\3\2\2\2\u0105\u0425\3\2\2\2\u0107\u0429\3\2\2\2\u0109\u0433\3\2"+
"\2\2\u010b\u043e\3\2\2\2\u010d\u0442\3\2\2\2\u010f\u044d\3\2\2\2\u0111"+
"\u0458\3\2\2\2\u0113\u0461\3\2\2\2\u0115\u0463\3\2\2\2\u0117\u0465\3\2"+
"\2\2\u0119\u0476\3\2\2\2\u011b\u0486\3\2\2\2\u011d\u048c\3\2\2\2\u011f"+
"\u0120\7*\2\2\u0120\4\3\2\2\2\u0121\u0122\7+\2\2\u0122\6\3\2\2\2\u0123"+
"\u0124\7.\2\2\u0124\b\3\2\2\2\u0125\u0126\7<\2\2\u0126\n\3\2\2\2\u0127"+
"\u0128\7C\2\2\u0128\u0129\7N\2\2\u0129\u012a\7N\2\2\u012a\f\3\2\2\2\u012b"+
"\u012c\7C\2\2\u012c\u012d\7P\2\2\u012d\u012e\7C\2\2\u012e\u012f\7N\2\2"+
"\u012f\u0130\7[\2\2\u0130\u0131\7\\\2\2\u0131\u0132\7G\2\2\u0132\16\3"+
"\2\2\2\u0133\u0134\7C\2\2\u0134\u0135\7P\2\2\u0135\u0136\7C\2\2\u0136"+
"\u0137\7N\2\2\u0137\u0138\7[\2\2\u0138\u0139\7\\\2\2\u0139\u013a\7G\2"+
"\2\u013a\u013b\7F\2\2\u013b\20\3\2\2\2\u013c\u013d\7C\2\2\u013d\u013e"+
"\7P\2\2\u013e\u013f\7F\2\2\u013f\22\3\2\2\2\u0140\u0141\7C\2\2\u0141\u0142"+
"\7P\2\2\u0142\u0143\7[\2\2\u0143\24\3\2\2\2\u0144\u0145\7C\2\2\u0145\u0146"+
"\7U\2\2\u0146\26\3\2\2\2\u0147\u0148\7C\2\2\u0148\u0149\7U\2\2\u0149\u014a"+
"\7E\2\2\u014a\30\3\2\2\2\u014b\u014c\7D\2\2\u014c\u014d\7G\2\2\u014d\u014e"+
"\7V\2\2\u014e\u014f\7Y\2\2\u014f\u0150\7G\2\2\u0150\u0151\7G\2\2\u0151"+
"\u0152\7P\2\2\u0152\32\3\2\2\2\u0153\u0154\7D\2\2\u0154\u0155\7[\2\2\u0155"+
"\34\3\2\2\2\u0156\u0157\7E\2\2\u0157\u0158\7C\2\2\u0158\u0159\7U\2\2\u0159"+
"\u015a\7G\2\2\u015a\36\3\2\2\2\u015b\u015c\7E\2\2\u015c\u015d\7C\2\2\u015d"+
"\u015e\7U\2\2\u015e\u015f\7V\2\2\u015f \3\2\2\2\u0160\u0161\7E\2\2\u0161"+
"\u0162\7C\2\2\u0162\u0163\7V\2\2\u0163\u0164\7C\2\2\u0164\u0165\7N\2\2"+
"\u0165\u0166\7Q\2\2\u0166\u0167\7I\2\2\u0167\"\3\2\2\2\u0168\u0169\7E"+
"\2\2\u0169\u016a\7C\2\2\u016a\u016b\7V\2\2\u016b\u016c\7C\2\2\u016c\u016d"+
"\7N\2\2\u016d\u016e\7Q\2\2\u016e\u016f\7I\2\2\u016f\u0170\7U\2\2\u0170"+
"$\3\2\2\2\u0171\u0172\7E\2\2\u0172\u0173\7Q\2\2\u0173\u0174\7N\2\2\u0174"+
"\u0175\7W\2\2\u0175\u0176\7O\2\2\u0176\u0177\7P\2\2\u0177\u0178\7U\2\2"+
"\u0178&\3\2\2\2\u0179\u017a\7E\2\2\u017a\u017b\7Q\2\2\u017b\u017c\7P\2"+
"\2\u017c\u017d\7X\2\2\u017d\u017e\7G\2\2\u017e\u017f\7T\2\2\u017f\u0180"+
"\7V\2\2\u0180(\3\2\2\2\u0181\u0182\7E\2\2\u0182\u0183\7W\2\2\u0183\u0184"+
"\7T\2\2\u0184\u0185\7T\2\2\u0185\u0186\7G\2\2\u0186\u0187\7P\2\2\u0187"+
"\u0188\7V\2\2\u0188\u0189\7a\2\2\u0189\u018a\7F\2\2\u018a\u018b\7C\2\2"+
"\u018b\u018c\7V\2\2\u018c\u018d\7G\2\2\u018d*\3\2\2\2\u018e\u018f\7E\2"+
"\2\u018f\u0190\7W\2\2\u0190\u0191\7T\2\2\u0191\u0192\7T\2\2\u0192\u0193"+
"\7G\2\2\u0193\u0194\7P\2\2\u0194\u0195\7V\2\2\u0195\u0196\7a\2\2\u0196"+
"\u0197\7V\2\2\u0197\u0198\7K\2\2\u0198\u0199\7O\2\2\u0199\u019a\7G\2\2"+
"\u019a,\3\2\2\2\u019b\u019c\7E\2\2\u019c\u019d\7W\2\2\u019d\u019e\7T\2"+
"\2\u019e\u019f\7T\2\2\u019f\u01a0\7G\2\2\u01a0\u01a1\7P\2\2\u01a1\u01a2"+
"\7V\2\2\u01a2\u01a3\7a\2\2\u01a3\u01a4\7V\2\2\u01a4\u01a5\7K\2\2\u01a5"+
"\u01a6\7O\2\2\u01a6\u01a7\7G\2\2\u01a7\u01a8\7U\2\2\u01a8\u01a9\7V\2\2"+
"\u01a9\u01aa\7C\2\2\u01aa\u01ab\7O\2\2\u01ab\u01ac\7R\2\2\u01ac.\3\2\2"+
"\2\u01ad\u01ae\7F\2\2\u01ae\u01af\7C\2\2\u01af\u01b0\7[\2\2\u01b0\60\3"+
"\2\2\2\u01b1\u01b2\7F\2\2\u01b2\u01b3\7C\2\2\u01b3\u01b4\7[\2\2\u01b4"+
"\u01b5\7U\2\2\u01b5\62\3\2\2\2\u01b6\u01b7\7F\2\2\u01b7\u01b8\7G\2\2\u01b8"+
"\u01b9\7D\2\2\u01b9\u01ba\7W\2\2\u01ba\u01bb\7I\2\2\u01bb\64\3\2\2\2\u01bc"+
"\u01bd\7F\2\2\u01bd\u01be\7G\2\2\u01be\u01bf\7U\2\2\u01bf\u01c0\7E\2\2"+
"\u01c0\66\3\2\2\2\u01c1\u01c2\7F\2\2\u01c2\u01c3\7G\2\2\u01c3\u01c4\7"+
"U\2\2\u01c4\u01c5\7E\2\2\u01c5\u01c6\7T\2\2\u01c6\u01c7\7K\2\2\u01c7\u01c8"+
"\7D\2\2\u01c8\u01c9\7G\2\2\u01c98\3\2\2\2\u01ca\u01cb\7F\2\2\u01cb\u01cc"+
"\7K\2\2\u01cc\u01cd\7U\2\2\u01cd\u01ce\7V\2\2\u01ce\u01cf\7K\2\2\u01cf"+
"\u01d0\7P\2\2\u01d0\u01d1\7E\2\2\u01d1\u01d2\7V\2\2\u01d2:\3\2\2\2\u01d3"+
"\u01d4\7G\2\2\u01d4\u01d5\7N\2\2\u01d5\u01d6\7U\2\2\u01d6\u01d7\7G\2\2"+
"\u01d7<\3\2\2\2\u01d8\u01d9\7G\2\2\u01d9\u01da\7P\2\2\u01da\u01db\7F\2"+
"\2\u01db>\3\2\2\2\u01dc\u01dd\7G\2\2\u01dd\u01de\7U\2\2\u01de\u01df\7"+
"E\2\2\u01df\u01e0\7C\2\2\u01e0\u01e1\7R\2\2\u01e1\u01e2\7G\2\2\u01e2@"+
"\3\2\2\2\u01e3\u01e4\7G\2\2\u01e4\u01e5\7Z\2\2\u01e5\u01e6\7G\2\2\u01e6"+
"\u01e7\7E\2\2\u01e7\u01e8\7W\2\2\u01e8\u01e9\7V\2\2\u01e9\u01ea\7C\2\2"+
"\u01ea\u01eb\7D\2\2\u01eb\u01ec\7N\2\2\u01ec\u01ed\7G\2\2\u01edB\3\2\2"+
"\2\u01ee\u01ef\7G\2\2\u01ef\u01f0\7Z\2\2\u01f0\u01f1\7K\2\2\u01f1\u01f2"+
"\7U\2\2\u01f2\u01f3\7V\2\2\u01f3\u01f4\7U\2\2\u01f4D\3\2\2\2\u01f5\u01f6"+
"\7G\2\2\u01f6\u01f7\7Z\2\2\u01f7\u01f8\7R\2\2\u01f8\u01f9\7N\2\2\u01f9"+
"\u01fa\7C\2\2\u01fa\u01fb\7K\2\2\u01fb\u01fc\7P\2\2\u01fcF\3\2\2\2\u01fd"+
"\u01fe\7G\2\2\u01fe\u01ff\7Z\2\2\u01ff\u0200\7V\2\2\u0200\u0201\7T\2\2"+
"\u0201\u0202\7C\2\2\u0202\u0203\7E\2\2\u0203\u0204\7V\2\2\u0204H\3\2\2"+
"\2\u0205\u0206\7H\2\2\u0206\u0207\7C\2\2\u0207\u0208\7N\2\2\u0208\u0209"+
"\7U\2\2\u0209\u020a\7G\2\2\u020aJ\3\2\2\2\u020b\u020c\7H\2\2\u020c\u020d"+
"\7K\2\2\u020d\u020e\7T\2\2\u020e\u020f\7U\2\2\u020f\u0210\7V\2\2\u0210"+
"L\3\2\2\2\u0211\u0212\7H\2\2\u0212\u0213\7Q\2\2\u0213\u0214\7T\2\2\u0214"+
"N\3\2\2\2\u0215\u0216\7H\2\2\u0216\u0217\7Q\2\2\u0217\u0218\7T\2\2\u0218"+
"\u0219\7O\2\2\u0219\u021a\7C\2\2\u021a\u021b\7V\2\2\u021bP\3\2\2\2\u021c"+
"\u021d\7H\2\2\u021d\u021e\7T\2\2\u021e\u021f\7Q\2\2\u021f\u0220\7O\2\2"+
"\u0220R\3\2\2\2\u0221\u0222\7H\2\2\u0222\u0223\7T\2\2\u0223\u0224\7Q\2"+
"\2\u0224\u0225\7\\\2\2\u0225\u0226\7G\2\2\u0226\u0227\7P\2\2\u0227T\3"+
"\2\2\2\u0228\u0229\7H\2\2\u0229\u022a\7W\2\2\u022a\u022b\7N\2\2\u022b"+
"\u022c\7N\2\2\u022cV\3\2\2\2\u022d\u022e\7H\2\2\u022e\u022f\7W\2\2\u022f"+
"\u0230\7P\2\2\u0230\u0231\7E\2\2\u0231\u0232\7V\2\2\u0232\u0233\7K\2\2"+
"\u0233\u0234\7Q\2\2\u0234\u0235\7P\2\2\u0235\u0236\7U\2\2\u0236X\3\2\2"+
"\2\u0237\u0238\7I\2\2\u0238\u0239\7T\2\2\u0239\u023a\7C\2\2\u023a\u023b"+
"\7R\2\2\u023b\u023c\7J\2\2\u023c\u023d\7X\2\2\u023d\u023e\7K\2\2\u023e"+
"\u023f\7\\\2\2\u023fZ\3\2\2\2\u0240\u0241\7I\2\2\u0241\u0242\7T\2\2\u0242"+
"\u0243\7Q\2\2\u0243\u0244\7W\2\2\u0244\u0245\7R\2\2\u0245\\\3\2\2\2\u0246"+
"\u0247\7J\2\2\u0247\u0248\7C\2\2\u0248\u0249\7X\2\2\u0249\u024a\7K\2\2"+
"\u024a\u024b\7P\2\2\u024b\u024c\7I\2\2\u024c^\3\2\2\2\u024d\u024e\7J\2"+
"\2\u024e\u024f\7Q\2\2\u024f\u0250\7W\2\2\u0250\u0251\7T\2\2\u0251`\3\2"+
"\2\2\u0252\u0253\7J\2\2\u0253\u0254\7Q\2\2\u0254\u0255\7W\2\2\u0255\u0256"+
"\7T\2\2\u0256\u0257\7U\2\2\u0257b\3\2\2\2\u0258\u0259\7K\2\2\u0259\u025a"+
"\7P\2\2\u025ad\3\2\2\2\u025b\u025c\7K\2\2\u025c\u025d\7P\2\2\u025d\u025e"+
"\7E\2\2\u025e\u025f\7N\2\2\u025f\u0260\7W\2\2\u0260\u0261\7F\2\2\u0261"+
"\u0262\7G\2\2\u0262f\3\2\2\2\u0263\u0264\7K\2\2\u0264\u0265\7P\2\2\u0265"+
"\u0266\7P\2\2\u0266\u0267\7G\2\2\u0267\u0268\7T\2\2\u0268h\3\2\2\2\u0269"+
"\u026a\7K\2\2\u026a\u026b\7P\2\2\u026b\u026c\7V\2\2\u026c\u026d\7G\2\2"+
"\u026d\u026e\7T\2\2\u026e\u026f\7X\2\2\u026f\u0270\7C\2\2\u0270\u0271"+
"\7N\2\2\u0271j\3\2\2\2\u0272\u0273\7K\2\2\u0273\u0274\7U\2\2\u0274l\3"+
"\2\2\2\u0275\u0276\7L\2\2\u0276\u0277\7Q\2\2\u0277\u0278\7K\2\2\u0278"+
"\u0279\7P\2\2\u0279n\3\2\2\2\u027a\u027b\7N\2\2\u027b\u027c\7C\2\2\u027c"+
"\u027d\7U\2\2\u027d\u027e\7V\2\2\u027ep\3\2\2\2\u027f\u0280\7N\2\2\u0280"+
"\u0281\7G\2\2\u0281\u0282\7H\2\2\u0282\u0283\7V\2\2\u0283r\3\2\2\2\u0284"+
"\u0285\7N\2\2\u0285\u0286\7K\2\2\u0286\u0287\7M\2\2\u0287\u0288\7G\2\2"+
"\u0288t\3\2\2\2\u0289\u028a\7N\2\2\u028a\u028b\7K\2\2\u028b\u028c\7O\2"+
"\2\u028c\u028d\7K\2\2\u028d\u028e\7V\2\2\u028ev\3\2\2\2\u028f\u0290\7"+
"O\2\2\u0290\u0291\7C\2\2\u0291\u0292\7R\2\2\u0292\u0293\7R\2\2\u0293\u0294"+
"\7G\2\2\u0294\u0295\7F\2\2\u0295x\3\2\2\2\u0296\u0297\7O\2\2\u0297\u0298"+
"\7C\2\2\u0298\u0299\7V\2\2\u0299\u029a\7E\2\2\u029a\u029b\7J\2\2\u029b"+
"z\3\2\2\2\u029c\u029d\7O\2\2\u029d\u029e\7K\2\2\u029e\u029f\7P\2\2\u029f"+
"\u02a0\7W\2\2\u02a0\u02a1\7V\2\2\u02a1\u02a2\7G\2\2\u02a2|\3\2\2\2\u02a3"+
"\u02a4\7O\2\2\u02a4\u02a5\7K\2\2\u02a5\u02a6\7P\2\2\u02a6\u02a7\7W\2\2"+
"\u02a7\u02a8\7V\2\2\u02a8\u02a9\7G\2\2\u02a9\u02aa\7U\2\2\u02aa~\3\2\2"+
"\2\u02ab\u02ac\7O\2\2\u02ac\u02ad\7Q\2\2\u02ad\u02ae\7P\2\2\u02ae\u02af"+
"\7V\2\2\u02af\u02b0\7J\2\2\u02b0\u0080\3\2\2\2\u02b1\u02b2\7O\2\2\u02b2"+
"\u02b3\7Q\2\2\u02b3\u02b4\7P\2\2\u02b4\u02b5\7V\2\2\u02b5\u02b6\7J\2\2"+
"\u02b6\u02b7\7U\2\2\u02b7\u0082\3\2\2\2\u02b8\u02b9\7P\2\2\u02b9\u02ba"+
"\7C\2\2\u02ba\u02bb\7V\2\2\u02bb\u02bc\7W\2\2\u02bc\u02bd\7T\2\2\u02bd"+
"\u02be\7C\2\2\u02be\u02bf\7N\2\2\u02bf\u0084\3\2\2\2\u02c0\u02c1\7P\2"+
"\2\u02c1\u02c2\7Q\2\2\u02c2\u02c3\7V\2\2\u02c3\u0086\3\2\2\2\u02c4\u02c5"+
"\7P\2\2\u02c5\u02c6\7W\2\2\u02c6\u02c7\7N\2\2\u02c7\u02c8\7N\2\2\u02c8"+
"\u0088\3\2\2\2\u02c9\u02ca\7P\2\2\u02ca\u02cb\7W\2\2\u02cb\u02cc\7N\2"+
"\2\u02cc\u02cd\7N\2\2\u02cd\u02ce\7U\2\2\u02ce\u008a\3\2\2\2\u02cf\u02d0"+
"\7Q\2\2\u02d0\u02d1\7P\2\2\u02d1\u008c\3\2\2\2\u02d2\u02d3\7Q\2\2\u02d3"+
"\u02d4\7R\2\2\u02d4\u02d5\7V\2\2\u02d5\u02d6\7K\2\2\u02d6\u02d7\7O\2\2"+
"\u02d7\u02d8\7K\2\2\u02d8\u02d9\7\\\2\2\u02d9\u02da\7G\2\2\u02da\u02db"+
"\7F\2\2\u02db\u008e\3\2\2\2\u02dc\u02dd\7Q\2\2\u02dd\u02de\7T\2\2\u02de"+
"\u0090\3\2\2\2\u02df\u02e0\7Q\2\2\u02e0\u02e1\7T\2\2\u02e1\u02e2\7F\2"+
"\2\u02e2\u02e3\7G\2\2\u02e3\u02e4\7T\2\2\u02e4\u0092\3\2\2\2\u02e5\u02e6"+
"\7Q\2\2\u02e6\u02e7\7W\2\2\u02e7\u02e8\7V\2\2\u02e8\u02e9\7G\2\2\u02e9"+
"\u02ea\7T\2\2\u02ea\u0094\3\2\2\2\u02eb\u02ec\7R\2\2\u02ec\u02ed\7C\2"+
"\2\u02ed\u02ee\7T\2\2\u02ee\u02ef\7U\2\2\u02ef\u02f0\7G\2\2\u02f0\u02f1"+
"\7F\2\2\u02f1\u0096\3\2\2\2\u02f2\u02f3\7R\2\2\u02f3\u02f4\7J\2\2\u02f4"+
"\u02f5\7[\2\2\u02f5\u02f6\7U\2\2\u02f6\u02f7\7K\2\2\u02f7\u02f8\7E\2\2"+
"\u02f8\u02f9\7C\2\2\u02f9\u02fa\7N\2\2\u02fa\u0098\3\2\2\2\u02fb\u02fc"+
"\7R\2\2\u02fc\u02fd\7K\2\2\u02fd\u02fe\7X\2\2\u02fe\u02ff\7Q\2\2\u02ff"+
"\u0300\7V\2\2\u0300\u009a\3\2\2\2\u0301\u0302\7R\2\2\u0302\u0303\7N\2"+
"\2\u0303\u0304\7C\2\2\u0304\u0305\7P\2\2\u0305\u009c\3\2\2\2\u0306\u0307"+
"\7T\2\2\u0307\u0308\7K\2\2\u0308\u0309\7I\2\2\u0309\u030a\7J\2\2\u030a"+
"\u030b\7V\2\2\u030b\u009e\3\2\2\2\u030c\u030d\7T\2\2\u030d\u030e\7N\2"+
"\2\u030e\u030f\7K\2\2\u030f\u0310\7M\2\2\u0310\u0311\7G\2\2\u0311\u00a0"+
"\3\2\2\2\u0312\u0313\7S\2\2\u0313\u0314\7W\2\2\u0314\u0315\7G\2\2\u0315"+
"\u0316\7T\2\2\u0316\u0317\7[\2\2\u0317\u00a2\3\2\2\2\u0318\u0319\7U\2"+
"\2\u0319\u031a\7E\2\2\u031a\u031b\7J\2\2\u031b\u031c\7G\2\2\u031c\u031d"+
"\7O\2\2\u031d\u031e\7C\2\2\u031e\u031f\7U\2\2\u031f\u00a4\3\2\2\2\u0320"+
"\u0321\7U\2\2\u0321\u0322\7G\2\2\u0322\u0323\7E\2\2\u0323\u0324\7Q\2\2"+
"\u0324\u0325\7P\2\2\u0325\u0326\7F\2\2\u0326\u00a6\3\2\2\2\u0327\u0328"+
"\7U\2\2\u0328\u0329\7G\2\2\u0329\u032a\7E\2\2\u032a\u032b\7Q\2\2\u032b"+
"\u032c\7P\2\2\u032c\u032d\7F\2\2\u032d\u032e\7U\2\2\u032e\u00a8\3\2\2"+
"\2\u032f\u0330\7U\2\2\u0330\u0331\7G\2\2\u0331\u0332\7N\2\2\u0332\u0333"+
"\7G\2\2\u0333\u0334\7E\2\2\u0334\u0335\7V\2\2\u0335\u00aa\3\2\2\2\u0336"+
"\u0337\7U\2\2\u0337\u0338\7J\2\2\u0338\u0339\7Q\2\2\u0339\u033a\7Y\2\2"+
"\u033a\u00ac\3\2\2\2\u033b\u033c\7U\2\2\u033c\u033d\7[\2\2\u033d\u033e"+
"\7U\2\2\u033e\u00ae\3\2\2\2\u033f\u0340\7V\2\2\u0340\u0341\7C\2\2\u0341"+
"\u0342\7D\2\2\u0342\u0343\7N\2\2\u0343\u0344\7G\2\2\u0344\u00b0\3\2\2"+
"\2\u0345\u0346\7V\2\2\u0346\u0347\7C\2\2\u0347\u0348\7D\2\2\u0348\u0349"+
"\7N\2\2\u0349\u034a\7G\2\2\u034a\u034b\7U\2\2\u034b\u00b2\3\2\2\2\u034c"+
"\u034d\7V\2\2\u034d\u034e\7G\2\2\u034e\u034f\7Z\2\2\u034f\u0350\7V\2\2"+
"\u0350\u00b4\3\2\2\2\u0351\u0352\7V\2\2\u0352\u0353\7J\2\2\u0353\u0354"+
"\7G\2\2\u0354\u0355\7P\2\2\u0355\u00b6\3\2\2\2\u0356\u0357\7V\2\2\u0357"+
"\u0358\7T\2\2\u0358\u0359\7W\2\2\u0359\u035a\7G\2\2\u035a\u00b8\3\2\2"+
"\2\u035b\u035c\7V\2\2\u035c\u035d\7Q\2\2\u035d\u00ba\3\2\2\2\u035e\u035f"+
"\7V\2\2\u035f\u0360\7Q\2\2\u0360\u0361\7R\2\2\u0361\u00bc\3\2\2\2\u0362"+
"\u0363\7V\2\2\u0363\u0364\7[\2\2\u0364\u0365\7R\2\2\u0365\u0366\7G\2\2"+
"\u0366\u00be\3\2\2\2\u0367\u0368\7V\2\2\u0368\u0369\7[\2\2\u0369\u036a"+
"\7R\2\2\u036a\u036b\7G\2\2\u036b\u036c\7U\2\2\u036c\u00c0\3\2\2\2\u036d"+
"\u036e\7W\2\2\u036e\u036f\7U\2\2\u036f\u0370\7K\2\2\u0370\u0371\7P\2\2"+
"\u0371\u0372\7I\2\2\u0372\u00c2\3\2\2\2\u0373\u0374\7X\2\2\u0374\u0375"+
"\7G\2\2\u0375\u0376\7T\2\2\u0376\u0377\7K\2\2\u0377\u0378\7H\2\2\u0378"+
"\u0379\7[\2\2\u0379\u00c4\3\2\2\2\u037a\u037b\7Y\2\2\u037b\u037c\7J\2"+
"\2\u037c\u037d\7G\2\2\u037d\u037e\7P\2\2\u037e\u00c6\3\2\2\2\u037f\u0380"+
"\7Y\2\2\u0380\u0381\7J\2\2\u0381\u0382\7G\2\2\u0382\u0383\7T\2\2\u0383"+
"\u0384\7G\2\2\u0384\u00c8\3\2\2\2\u0385\u0386\7Y\2\2\u0386\u0387\7K\2"+
"\2\u0387\u0388\7V\2\2\u0388\u0389\7J\2\2\u0389\u00ca\3\2\2\2\u038a\u038b"+
"\7[\2\2\u038b\u038c\7G\2\2\u038c\u038d\7C\2\2\u038d\u038e\7T\2\2\u038e"+
"\u00cc\3\2\2\2\u038f\u0390\7[\2\2\u0390\u0391\7G\2\2\u0391\u0392\7C\2"+
"\2\u0392\u0393\7T\2\2\u0393\u0394\7U\2\2\u0394\u00ce\3\2\2\2\u0395\u0396"+
"\5\u00ddo\2\u0396\u0397\7G\2\2\u0397\u0398\7U\2\2\u0398\u0399\7E\2\2\u0399"+
"\u039a\7C\2\2\u039a\u039b\7R\2\2\u039b\u039c\7G\2\2\u039c\u00d0\3\2\2"+
"\2\u039d\u039e\5\u00ddo\2\u039e\u039f\7H\2\2\u039f\u03a0\7P\2\2\u03a0"+
"\u00d2\3\2\2\2\u03a1\u03a2\5\u00ddo\2\u03a2\u03a3\7N\2\2\u03a3\u03a4\7"+
"K\2\2\u03a4\u03a5\7O\2\2\u03a5\u03a6\7K\2\2\u03a6\u03a7\7V\2\2\u03a7\u00d4"+
"\3\2\2\2\u03a8\u03a9\5\u00ddo\2\u03a9\u03aa\7F\2\2\u03aa\u00d6\3\2\2\2"+
"\u03ab\u03ac\5\u00ddo\2\u03ac\u03ad\7V\2\2\u03ad\u00d8\3\2\2\2\u03ae\u03af"+
"\5\u00ddo\2\u03af\u03b0\7V\2\2\u03b0\u03b1\7U\2\2\u03b1\u00da\3\2\2\2"+
"\u03b2\u03b3\5\u00ddo\2\u03b3\u03b4\7I\2\2\u03b4\u03b5\7W\2\2\u03b5\u03b6"+
"\7K\2\2\u03b6\u03b7\7F\2\2\u03b7\u00dc\3\2\2\2\u03b8\u03bc\7}\2\2\u03b9"+
"\u03bb\5\u011b\u008e\2\u03ba\u03b9\3\2\2\2\u03bb\u03be\3\2\2\2\u03bc\u03ba"+
"\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd\u00de\3\2\2\2\u03be\u03bc\3\2\2\2\u03bf"+
"\u03c0\7\177\2\2\u03c0\u00e0\3\2\2\2\u03c1\u03c2\7?\2\2\u03c2\u00e2\3"+
"\2\2\2\u03c3\u03c4\7>\2\2\u03c4\u03c5\7?\2\2\u03c5\u03c6\7@\2\2\u03c6"+
"\u00e4\3\2\2\2\u03c7\u03c8\7>\2\2\u03c8\u03cc\7@\2\2\u03c9\u03ca\7#\2"+
"\2\u03ca\u03cc\7?\2\2\u03cb\u03c7\3\2\2\2\u03cb\u03c9\3\2\2\2\u03cc\u00e6"+
"\3\2\2\2\u03cd\u03ce\7>\2\2\u03ce\u00e8\3\2\2\2\u03cf\u03d0\7>\2\2\u03d0"+
"\u03d1\7?\2\2\u03d1\u00ea\3\2\2\2\u03d2\u03d3\7@\2\2\u03d3\u00ec\3\2\2"+
"\2\u03d4\u03d5\7@\2\2\u03d5\u03d6\7?\2\2\u03d6\u00ee\3\2\2\2\u03d7\u03d8"+
"\7-\2\2\u03d8\u00f0\3\2\2\2\u03d9\u03da\7/\2\2\u03da\u00f2\3\2\2\2\u03db"+
"\u03dc\7,\2\2\u03dc\u00f4\3\2\2\2\u03dd\u03de\7\61\2\2\u03de\u00f6\3\2"+
"\2\2\u03df\u03e0\7\'\2\2\u03e0\u00f8\3\2\2\2\u03e1\u03e2\7<\2\2\u03e2"+
"\u03e3\7<\2\2\u03e3\u00fa\3\2\2\2\u03e4\u03e5\7~\2\2\u03e5\u03e6\7~\2"+
"\2\u03e6\u00fc\3\2\2\2\u03e7\u03e8\7\60\2\2\u03e8\u00fe\3\2\2\2\u03e9"+
"\u03ea\7A\2\2\u03ea\u0100\3\2\2\2\u03eb\u03f1\7)\2\2\u03ec\u03f0\n\2\2"+
"\2\u03ed\u03ee\7)\2\2\u03ee\u03f0\7)\2\2\u03ef\u03ec\3\2\2\2\u03ef\u03ed"+
"\3\2\2\2\u03f0\u03f3\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f1\u03f2\3\2\2\2\u03f2"+
"\u03f4\3\2\2\2\u03f3\u03f1\3\2\2\2\u03f4\u03f5\7)\2\2\u03f5\u0102\3\2"+
"\2\2\u03f6\u03f8\5\u0113\u008a\2\u03f7\u03f6\3\2\2\2\u03f8\u03f9\3\2\2"+
"\2\u03f9\u03f7\3\2\2\2\u03f9\u03fa\3\2\2\2\u03fa\u0104\3\2\2\2\u03fb\u03fd"+
"\5\u0113\u008a\2\u03fc\u03fb\3\2\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03fc\3"+
"\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u0400\3\2\2\2\u0400\u0404\5\u00fd\177"+
"\2\u0401\u0403\5\u0113\u008a\2\u0402\u0401\3\2\2\2\u0403\u0406\3\2\2\2"+
"\u0404\u0402\3\2\2\2\u0404\u0405\3\2\2\2\u0405\u0426\3\2\2\2\u0406\u0404"+
"\3\2\2\2\u0407\u0409\5\u00fd\177\2\u0408\u040a\5\u0113\u008a\2\u0409\u0408"+
"\3\2\2\2\u040a\u040b\3\2\2\2\u040b\u0409\3\2\2\2\u040b\u040c\3\2\2\2\u040c"+
"\u0426\3\2\2\2\u040d\u040f\5\u0113\u008a\2\u040e\u040d\3\2\2\2\u040f\u0410"+
"\3\2\2\2\u0410\u040e\3\2\2\2\u0410\u0411\3\2\2\2\u0411\u0419\3\2\2\2\u0412"+
"\u0416\5\u00fd\177\2\u0413\u0415\5\u0113\u008a\2\u0414\u0413\3\2\2\2\u0415"+
"\u0418\3\2\2\2\u0416\u0414\3\2\2\2\u0416\u0417\3\2\2\2\u0417\u041a\3\2"+
"\2\2\u0418\u0416\3\2\2\2\u0419\u0412\3\2\2\2\u0419\u041a\3\2\2\2\u041a"+
"\u041b\3\2\2\2\u041b\u041c\5\u0111\u0089\2\u041c\u0426\3\2\2\2\u041d\u041f"+
"\5\u00fd\177\2\u041e\u0420\5\u0113\u008a\2\u041f\u041e\3\2\2\2\u0420\u0421"+
"\3\2\2\2\u0421\u041f\3\2\2\2\u0421\u0422\3\2\2\2\u0422\u0423\3\2\2\2\u0423"+
"\u0424\5\u0111\u0089\2\u0424\u0426\3\2\2\2\u0425\u03fc\3\2\2\2\u0425\u0407"+
"\3\2\2\2\u0425\u040e\3\2\2\2\u0425\u041d\3\2\2\2\u0426\u0106\3\2\2\2\u0427"+
"\u042a\5\u0115\u008b\2\u0428\u042a\7a\2\2\u0429\u0427\3\2\2\2\u0429\u0428"+
"\3\2\2\2\u042a\u0430\3\2\2\2\u042b\u042f\5\u0115\u008b\2\u042c\u042f\5"+
"\u0113\u008a\2\u042d\u042f\t\3\2\2\u042e\u042b\3\2\2\2\u042e\u042c\3\2"+
"\2\2\u042e\u042d\3\2\2\2\u042f\u0432\3\2\2\2\u0430\u042e\3\2\2\2\u0430"+
"\u0431\3\2\2\2\u0431\u0108\3\2\2\2\u0432\u0430\3\2\2\2\u0433\u0437\5\u0113"+
"\u008a\2\u0434\u0438\5\u0115\u008b\2\u0435\u0438\5\u0113\u008a\2\u0436"+
"\u0438\t\3\2\2\u0437\u0434\3\2\2\2\u0437\u0435\3\2\2\2\u0437\u0436\3\2"+
"\2\2\u0438\u0439\3\2\2\2\u0439\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a"+
"\u010a\3\2\2\2\u043b\u043f\5\u0115\u008b\2\u043c\u043f\5\u0113\u008a\2"+
"\u043d\u043f\7a\2\2\u043e\u043b\3\2\2\2\u043e\u043c\3\2\2\2\u043e\u043d"+
"\3\2\2\2\u043f\u0440\3\2\2\2\u0440\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441"+
"\u010c\3\2\2\2\u0442\u0448\7$\2\2\u0443\u0447\n\4\2\2\u0444\u0445\7$\2"+
"\2\u0445\u0447\7$\2\2\u0446\u0443\3\2\2\2\u0446\u0444\3\2\2\2\u0447\u044a"+
"\3\2\2\2\u0448\u0446\3\2\2\2\u0448\u0449\3\2\2\2\u0449\u044b\3\2\2\2\u044a"+
"\u0448\3\2\2\2\u044b\u044c\7$\2\2\u044c\u010e\3\2\2\2\u044d\u0453\7b\2"+
"\2\u044e\u0452\n\5\2\2\u044f\u0450\7b\2\2\u0450\u0452\7b\2\2\u0451\u044e"+
"\3\2\2\2\u0451\u044f\3\2\2\2\u0452\u0455\3\2\2\2\u0453\u0451\3\2\2\2\u0453"+
"\u0454\3\2\2\2\u0454\u0456\3\2\2\2\u0455\u0453\3\2\2\2\u0456\u0457\7b"+
"\2\2\u0457\u0110\3\2\2\2\u0458\u045a\7G\2\2\u0459\u045b\t\6\2\2\u045a"+
"\u0459\3\2\2\2\u045a\u045b\3\2\2\2\u045b\u045d\3\2\2\2\u045c\u045e\5\u0113"+
"\u008a\2\u045d\u045c\3\2\2\2\u045e\u045f\3\2\2\2\u045f\u045d\3\2\2\2\u045f"+
"\u0460\3\2\2\2\u0460\u0112\3\2\2\2\u0461\u0462\t\7\2\2\u0462\u0114\3\2"+
"\2\2\u0463\u0464\t\b\2\2\u0464\u0116\3\2\2\2\u0465\u0466\7/\2\2\u0466"+
"\u0467\7/\2\2\u0467\u046b\3\2\2\2\u0468\u046a\n\t\2\2\u0469\u0468\3\2"+
"\2\2\u046a\u046d\3\2\2\2\u046b\u0469\3\2\2\2\u046b\u046c\3\2\2\2\u046c"+
"\u046f\3\2\2\2\u046d\u046b\3\2\2\2\u046e\u0470\7\17\2\2\u046f\u046e\3"+
"\2\2\2\u046f\u0470\3\2\2\2\u0470\u0472\3\2\2\2\u0471\u0473\7\f\2\2\u0472"+
"\u0471\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0474\3\2\2\2\u0474\u0475\b\u008c"+
"\2\2\u0475\u0118\3\2\2\2\u0476\u0477\7\61\2\2\u0477\u0478\7,\2\2\u0478"+
"\u047d\3\2\2\2\u0479\u047c\5\u0119\u008d\2\u047a\u047c\13\2\2\2\u047b"+
"\u0479\3\2\2\2\u047b\u047a\3\2\2\2\u047c\u047f\3\2\2\2\u047d\u047e\3\2"+
"\2\2\u047d\u047b\3\2\2\2\u047e\u0480\3\2\2\2\u047f\u047d\3\2\2\2\u0480"+
"\u0481\7,\2\2\u0481\u0482\7\61\2\2\u0482\u0483\3\2\2\2\u0483\u0484\b\u008d"+
"\2\2\u0484\u011a\3\2\2\2\u0485\u0487\t\n\2\2\u0486\u0485\3\2\2\2\u0487"+
"\u0488\3\2\2\2\u0488\u0486\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048a\3\2"+
"\2\2\u048a\u048b\b\u008e\2\2\u048b\u011c\3\2\2\2\u048c\u048d\13\2\2\2"+
"\u048d\u011e\3\2\2\2#\2\u03bc\u03cb\u03ef\u03f1\u03f9\u03fe\u0404\u040b"+
"\u0410\u0416\u0419\u0421\u0425\u0429\u042e\u0430\u0437\u0439\u043e\u0440"+
"\u0446\u0448\u0451\u0453\u045a\u045f\u046b\u046f\u0472\u047b\u047d\u0488"+
"\3\2\3\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());

View File

@ -273,6 +273,16 @@ interface SqlBaseListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitNamedQuery(SqlBaseParser.NamedQueryContext ctx);
/**
* Enter a parse tree produced by {@link SqlBaseParser#topClause}.
* @param ctx the parse tree
*/
void enterTopClause(SqlBaseParser.TopClauseContext ctx);
/**
* Exit a parse tree produced by {@link SqlBaseParser#topClause}.
* @param ctx the parse tree
*/
void exitTopClause(SqlBaseParser.TopClauseContext ctx);
/**
* Enter a parse tree produced by {@link SqlBaseParser#setQuantifier}.
* @param ctx the parse tree

View File

@ -167,6 +167,12 @@ interface SqlBaseVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitNamedQuery(SqlBaseParser.NamedQueryContext ctx);
/**
* Visit a parse tree produced by {@link SqlBaseParser#topClause}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitTopClause(SqlBaseParser.TopClauseContext ctx);
/**
* Visit a parse tree produced by {@link SqlBaseParser#setQuantifier}.
* @param ctx the parse tree

View File

@ -17,12 +17,15 @@ import org.elasticsearch.xpack.ql.expression.predicate.fulltext.MatchQueryPredic
import org.elasticsearch.xpack.ql.expression.predicate.fulltext.MultiMatchQueryPredicate;
import org.elasticsearch.xpack.ql.expression.predicate.fulltext.StringQueryPredicate;
import org.elasticsearch.xpack.ql.plan.logical.Filter;
import org.elasticsearch.xpack.ql.plan.logical.Limit;
import org.elasticsearch.xpack.ql.plan.logical.LogicalPlan;
import org.elasticsearch.xpack.ql.plan.logical.OrderBy;
import org.elasticsearch.xpack.ql.plan.logical.Project;
import org.elasticsearch.xpack.ql.plan.logical.UnresolvedRelation;
import org.elasticsearch.xpack.sql.plan.logical.With;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringJoiner;
@ -106,12 +109,49 @@ public class SqlParserTests extends ESTestCase {
assertEquals("RIGHT()", f.sourceText());
}
public void testLimit() {
LogicalPlan plan = parseStatement("SELECT * FROM test LIMIT 10");
assertEquals(With.class, plan.getClass());
LogicalPlan child = ((With) plan).child();
assertEquals(Limit.class, child.getClass());
assertEquals(10, ((Limit) child).limit().fold());
plan = parseStatement("SELECT a, count(*) cnt FROM test WHERE b = 20 GROUP BY a HAVING cnt > 10 ORDER BY 2 LIMIT 30");
assertEquals(With.class, plan.getClass());
child = ((With) plan).child();
assertEquals(Limit.class, child.getClass());
assertEquals(30, ((Limit) child).limit().fold());
}
public void testTop() {
String selectList = randomFrom(Arrays.asList("*", "a, b", "a, b, c, d.*"));
LogicalPlan plan = parseStatement("SELECT TOP 10 " + selectList + " FROM test");
assertEquals(With.class, plan.getClass());
LogicalPlan child = ((With) plan).child();
assertEquals(Limit.class, child.getClass());
assertEquals(10, ((Limit) child).limit().fold());
plan = parseStatement("SELECT TOP 30 a, count(*) cnt FROM test WHERE b = 20 GROUP BY a HAVING cnt > 10");
assertEquals(With.class, plan.getClass());
child = ((With) plan).child();
assertEquals(Limit.class, child.getClass());
assertEquals(30, ((Limit) child).limit().fold());
}
public void testUseBothTopAndLimitInvalid() {
ParsingException e = expectThrows(ParsingException.class, () -> parseStatement("SELECT TOP 10 * FROM test LIMIT 20"));
assertEquals("line 1:28: TOP and LIMIT are not allowed in the same query - use one or the other", e.getMessage());
e = expectThrows(ParsingException.class,
() -> parseStatement("SELECT TOP 30 a, count(*) cnt FROM test WHERE b = 20 GROUP BY a HAVING cnt > 10 LIMIT 40"));
assertEquals("line 1:82: TOP and LIMIT are not allowed in the same query - use one or the other", e.getMessage());
}
public void testsSelectNonReservedKeywords() {
String[] reserved = new String[] {
"ANALYZE", "ANALYZED", "CATALOGS", "COLUMNS", "CURRENT", "DAY", "DEBUG", "EXECUTABLE", "EXPLAIN",
"FIRST", "FORMAT", "FULL", "FUNCTIONS", "GRAPHVIZ", "HOUR", "INTERVAL", "LAST", "LIMIT",
"MAPPED", "MINUTE", "MONTH", "OPTIMIZED", "PARSED", "PHYSICAL", "PLAN", "QUERY", "RLIKE",
"SCHEMAS", "SECOND", "SHOW", "SYS", "TABLES", "TEXT", "TYPE", "TYPES", "VERIFY", "YEAR"};
"SCHEMAS", "SECOND", "SHOW", "SYS", "TABLES", "TEXT", "TOP", "TYPE", "TYPES", "VERIFY", "YEAR"};
StringJoiner sj = new StringJoiner(",");
for (String s : reserved) {
sj.add(s);