diff --git a/genparser.sh b/genparser.sh old mode 100644 new mode 100755 diff --git a/src/main/antlr4/GobraLexer.g4 b/src/main/antlr4/GobraLexer.g4 index 7db1c0e1f..db44fc749 100644 --- a/src/main/antlr4/GobraLexer.g4 +++ b/src/main/antlr4/GobraLexer.g4 @@ -85,3 +85,4 @@ IMPORT_PRE : 'importRequires'; PROOF : 'proof'; GHOST_EQUALS : '==='; GHOST_NOT_EQUALS : '!=='; +WITH : 'with'; diff --git a/src/main/antlr4/GobraParser.g4 b/src/main/antlr4/GobraParser.g4 index 632f06bdd..5b1a4fe8d 100644 --- a/src/main/antlr4/GobraParser.g4 +++ b/src/main/antlr4/GobraParser.g4 @@ -434,3 +434,10 @@ assign_op: ass_op=( | AMPERSAND | BIT_CLEAR )? ASSIGN; + +// Add permission argument to range + +rangeClause: ( + expressionList ASSIGN + | maybeAddressableIdentifierList DECLARE_ASSIGN + )? RANGE expression (WITH IDENTIFIER?)?; diff --git a/src/main/java/viper/gobra/frontend/GobraLexer.java b/src/main/java/viper/gobra/frontend/GobraLexer.java index 9eee0a38d..9f1810987 100644 --- a/src/main/java/viper/gobra/frontend/GobraLexer.java +++ b/src/main/java/viper/gobra/frontend/GobraLexer.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraLexer.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraLexer.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -27,21 +27,21 @@ public class GobraLexer extends Lexer { PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58, SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64, OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70, - BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77, - GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85, - CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92, - IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99, - L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105, - SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111, - ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116, - LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121, - DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127, - PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133, - DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138, - IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142, - HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146, - INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151, - WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156; + WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77, + DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85, + SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92, + FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99, + R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105, + COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111, + DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116, + NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121, + OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128, + PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134, + DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139, + IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143, + HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147, + INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152, + WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157; public static final int NLSEMI=1; public static String[] channelNames = { @@ -63,9 +63,9 @@ private static String[] makeRuleNames() { "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", - "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", - "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", @@ -96,15 +96,15 @@ private static String[] makeLiteralNames() { "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", - "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -119,9 +119,9 @@ private static String[] makeSymbolicNames() { "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", - "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", - "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", @@ -213,7 +213,7 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009e\u05bc\b\1\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u009f\u05c3\b\1\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"+ @@ -236,665 +236,668 @@ private boolean DECIMAL_FLOAT_LIT_sempred(RuleContext _localctx, int predIndex) "\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f"+ "\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4"+ "\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8"+ - "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\3\2\3\2\5\2\u0159\n\2\3\2\3\2\3\3\3\3"+ - "\3\3\3\3\5\3\u0161\n\3\3\3\5\3\u0164\n\3\3\3\5\3\u0167\n\3\3\3\3\3\3\3"+ - "\3\3\5\3\u016d\n\3\5\3\u016f\n\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3"+ - "\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\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\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3"+ - "\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ - "\3\13\3\13\3\f\3\f\3\f\3\f\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\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ - "\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3"+ - "\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\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\23\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\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\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+ - "\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+ - "\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3"+ - "\36\3\36\3\36\3\36\3\37\3\37\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\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\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\64\3\64\3\65\3\65\3\65\3"+ - "\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3"+ - "\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38\38\38\39\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?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A"+ - "\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3D\3D\3D"+ - "\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3G"+ - "\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J"+ - "\3J\3K\3K\3K\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M"+ - "\3N\3N\3N\3N\3N\3N\3O\3O\3O\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R"+ - "\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V"+ - "\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X\3X"+ - "\3X\3Y\3Y\3Y\3Z\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_\3_\3_\3"+ - "_\3_\3_\3_\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\7b\u0407\nb\fb\16b\u040a"+ - "\13b\3b\3b\3c\3c\3d\3d\3d\3d\3e\3e\3f\3f\3f\3f\3g\3g\3h\3h\3h\3h\3i\3"+ - "i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3p\3p\3p\3q\3"+ - "q\3q\3q\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3w\3w\3w\3x\3x\3y\3"+ - "y\3y\3z\3z\3{\3{\3|\3|\3}\3}\3}\3~\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080"+ - "\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085"+ - "\3\u0085\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u0472"+ - "\n\u0087\3\u0087\7\u0087\u0475\n\u0087\f\u0087\16\u0087\u0478\13\u0087"+ - "\5\u0087\u047a\n\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088"+ - "\u0481\n\u0088\3\u0088\6\u0088\u0484\n\u0088\r\u0088\16\u0088\u0485\3"+ - "\u0088\3\u0088\3\u0089\3\u0089\5\u0089\u048c\n\u0089\3\u0089\5\u0089\u048f"+ - "\n\u0089\3\u0089\6\u0089\u0492\n\u0089\r\u0089\16\u0089\u0493\3\u0089"+ - "\3\u0089\3\u008a\3\u008a\3\u008a\5\u008a\u049b\n\u008a\3\u008a\6\u008a"+ - "\u049e\n\u008a\r\u008a\16\u008a\u049f\3\u008a\3\u008a\3\u008b\3\u008b"+ - "\3\u008b\3\u008b\3\u008b\3\u008c\5\u008c\u04aa\n\u008c\3\u008c\6\u008c"+ - "\u04ad\n\u008c\r\u008c\16\u008c\u04ae\3\u008c\3\u008c\5\u008c\u04b3\n"+ - "\u008c\3\u008c\7\u008c\u04b6\n\u008c\f\u008c\16\u008c\u04b9\13\u008c\5"+ - "\u008c\u04bb\n\u008c\3\u008c\3\u008c\3\u008c\5\u008c\u04c0\n\u008c\3\u008c"+ - "\7\u008c\u04c3\n\u008c\f\u008c\16\u008c\u04c6\13\u008c\5\u008c\u04c8\n"+ - "\u008c\3\u008d\3\u008d\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\3\u008e"+ - "\3\u008e\5\u008e\u04d3\n\u008e\3\u008e\3\u008e\3\u008e\3\u008e\3\u008f"+ - "\3\u008f\3\u008f\5\u008f\u04dc\n\u008f\3\u008f\3\u008f\3\u0090\3\u0090"+ - "\3\u0090\3\u0090\3\u0091\3\u0091\5\u0091\u04e6\n\u0091\3\u0092\3\u0092"+ - "\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094"+ - "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095"+ - "\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\3\u0096"+ - "\3\u0096\7\u0096\u0506\n\u0096\f\u0096\16\u0096\u0509\13\u0096\3\u0096"+ - "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\7\u0097\u0512\n\u0097"+ - "\f\u0097\16\u0097\u0515\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098"+ - "\6\u0098\u051c\n\u0098\r\u0098\16\u0098\u051d\3\u0098\3\u0098\3\u0099"+ - "\3\u0099\3\u0099\3\u0099\7\u0099\u0526\n\u0099\f\u0099\16\u0099\u0529"+ - "\13\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u0099\3\u009a\6\u009a\u0531"+ - "\n\u009a\r\u009a\16\u009a\u0532\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b"+ - "\3\u009b\7\u009b\u053b\n\u009b\f\u009b\16\u009b\u053e\13\u009b\3\u009b"+ - "\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0546\n\u009c\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d"+ - "\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\3\u009d\5\u009d\u0562"+ - "\n\u009d\3\u009e\3\u009e\5\u009e\u0566\n\u009e\3\u009e\7\u009e\u0569\n"+ - "\u009e\f\u009e\16\u009e\u056c\13\u009e\3\u009f\3\u009f\3\u00a0\3\u00a0"+ - "\3\u00a1\3\u00a1\3\u00a2\3\u00a2\5\u00a2\u0576\n\u00a2\3\u00a2\3\u00a2"+ - "\3\u00a3\3\u00a3\5\u00a3\u057c\n\u00a3\3\u00a4\3\u00a4\3\u00a5\3\u00a5"+ - "\3\u00a6\6\u00a6\u0583\n\u00a6\r\u00a6\16\u00a6\u0584\3\u00a6\3\u00a6"+ - "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u058d\n\u00a7\f\u00a7\16\u00a7"+ - "\u0590\13\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+ - "\3\u00a8\3\u00a8\7\u00a8\u059b\n\u00a8\f\u00a8\16\u00a8\u059e\13\u00a8"+ - "\3\u00a8\3\u00a8\3\u00a9\6\u00a9\u05a3\n\u00a9\r\u00a9\16\u00a9\u05a4"+ - "\3\u00a9\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9\u05ac\n\u00a9\f\u00a9"+ - "\16\u00a9\u05af\13\u00a9\3\u00a9\3\u00a9\3\u00a9\5\u00a9\u05b4\n\u00a9"+ - "\3\u00a9\3\u00a9\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u0527\u058e"+ - "\u05ad\2\u00ab\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16"+ - "\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\34"+ - "8\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65"+ - "j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008c"+ - "G\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0"+ - "Q\u00a2R\u00a4S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4"+ - "[\u00b6\\\u00b8]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8"+ - "e\u00caf\u00ccg\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dc"+ - "o\u00dep\u00e0q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0"+ - "y\u00f2z\u00f4{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081"+ - "\u0102\u0082\u0104\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087"+ - "\u010e\u0088\u0110\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\2\u011a"+ - "\2\u011c\u008d\u011e\2\u0120\u008e\u0122\u008f\u0124\u0090\u0126\u0091"+ - "\u0128\u0092\u012a\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097"+ - "\u0134\u0098\u0136\u0099\u0138\2\u013a\2\u013c\2\u013e\2\u0140\2\u0142"+ - "\2\u0144\2\u0146\2\u0148\2\u014a\2\u014c\u009a\u014e\u009b\u0150\u009c"+ - "\u0152\u009d\u0154\u009e\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2"+ - "ZZzz\4\2RRrr\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f"+ - "\17\17))\13\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg"+ - "\49\2\62\2;\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2"+ - "\u0971\2\u09e8\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71"+ - "\2\u0be8\2\u0bf1\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8"+ - "\2\u0df1\2\u0e52\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b"+ - "\2\u1092\2\u109b\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2"+ - "\2\u19db\2\u1a82\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb"+ - "\2\u1c42\2\u1c4b\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902"+ - "\2\ua90b\2\ua9d2\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb"+ - "\2\uff12\2\uff1b\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138"+ - "\3\u1141\3\u11d2\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db"+ - "\3\u1652\3\u165b\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52"+ - "\3\u1c5b\3\u1d52\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801"+ - "\3\ue952\3\ue95b\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7"+ - "\2\u00bc\2\u00bc\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8"+ - "\2\u02d3\2\u02e2\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376"+ - "\2\u0378\2\u0379\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a"+ - "\2\u038c\2\u038e\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483"+ - "\2\u048c\2\u0531\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2"+ - "\2\u05ec\2\u05f2\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5"+ - "\2\u06d7\2\u06d7\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701"+ - "\2\u0701\2\u0712\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3"+ - "\2\u07cc\2\u07ec\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c"+ - "\2\u081c\2\u0826\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c"+ - "\2\u08a2\2\u08b6\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952"+ - "\2\u0952\2\u095a\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992"+ - "\2\u0995\2\u09aa\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf"+ - "\2\u09bf\2\u09d0\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3"+ - "\2\u09fe\2\u09fe\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c"+ - "\2\u0a32\2\u0a34\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e"+ - "\2\u0a60\2\u0a60\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95"+ - "\2\u0aaa\2\u0aac\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf"+ - "\2\u0ad2\2\u0ad2\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11"+ - "\2\u0b12\2\u0b15\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b"+ - "\2\u0b3f\2\u0b3f\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85"+ - "\2\u0b85\2\u0b87\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c"+ - "\2\u0b9e\2\u0b9e\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0"+ - "\2\u0bbb\2\u0bd2\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a"+ - "\2\u0c2c\2\u0c3b\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82"+ - "\2\u0c82\2\u0c87\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5"+ - "\2\u0cb7\2\u0cbb\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3"+ - "\2\u0cf4\2\u0d07\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f"+ - "\2\u0d50\2\u0d50\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87"+ - "\2\u0d98\2\u0d9c\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8"+ - "\2\u0e03\2\u0e32\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86"+ - "\2\u0e86\2\u0e89\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99"+ - "\2\u0e9b\2\u0ea1\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac"+ - "\2\u0ead\2\u0eaf\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6"+ - "\2\u0ec8\2\u0ec8\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b"+ - "\2\u0f6e\2\u0f8a\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057"+ - "\2\u105c\2\u105f\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077"+ - "\2\u1083\2\u1090\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf"+ - "\2\u10d2\2\u10fc\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a"+ - "\2\u125a\2\u125c\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2"+ - "\2\u12b4\2\u12b7\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca"+ - "\2\u12d8\2\u12da\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391"+ - "\2\u13a2\2\u13f7\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683"+ - "\2\u169c\2\u16a2\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713"+ - "\2\u1722\2\u1733\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782"+ - "\2\u17b5\2\u17d9\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886"+ - "\2\u1889\2\u18aa\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952"+ - "\2\u196f\2\u1972\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18"+ - "\2\u1a22\2\u1a56\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85"+ - "\2\u1ba2\2\u1bb0\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51"+ - "\2\u1c5c\2\u1c7f\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7"+ - "\2\u1cf8\2\u1d02\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47"+ - "\2\u1f4a\2\u1f4f\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f"+ - "\2\u1f5f\2\u1f61\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0"+ - "\2\u1fc4\2\u1fc6\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2"+ - "\2\u1fee\2\u1ff4\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081"+ - "\2\u2092\2\u209e\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117"+ - "\2\u2117\2\u211b\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a"+ - "\2\u212c\2\u212f\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150"+ - "\2\u2150\2\u2185\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6"+ - "\2\u2ced\2\u2cf0\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f"+ - "\2\u2d2f\2\u2d32\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8"+ - "\2\u2daa\2\u2db0\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca"+ - "\2\u2dd0\2\u2dd2\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008"+ - "\2\u3033\2\u3037\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3"+ - "\2\u30fc\2\u30fe\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc"+ - "\2\u31f2\2\u3201\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2"+ - "\2\ua4ff\2\ua502\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670"+ - "\2\ua681\2\ua69f\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d"+ - "\2\ua7b0\2\ua7b2\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c"+ - "\2\ua80e\2\ua824\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd"+ - "\2\ua8fd\2\ua8ff\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e"+ - "\2\ua986\2\ua9b4\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc"+ - "\2\uaa00\2\uaa02\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78"+ - "\2\uaa7c\2\uaa7c\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb"+ - "\2\uaabf\2\uaac2\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec"+ - "\2\uaaf4\2\uaaf6\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22"+ - "\2\uab28\2\uab2a\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4"+ - "\2\uac02\2\ud7a5\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72"+ - "\2\ufadb\2\ufb02\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a"+ - "\2\ufb2c\2\ufb38\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45"+ - "\2\ufb46\2\ufb48\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9"+ - "\2\ufdf2\2\ufdfd\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43"+ - "\2\uff5c\2\uff68\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9"+ - "\2\uffdc\2\uffde\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc"+ - "\3\u0282\3\u029e\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344"+ - "\3\u034b\3\u0352\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1"+ - "\3\u0402\3\u049f\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532"+ - "\3\u0565\3\u0602\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807"+ - "\3\u080a\3\u080a\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841"+ - "\3\u0857\3\u0862\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7"+ - "\3\u0902\3\u0917\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02"+ - "\3\u0a02\3\u0a12\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e"+ - "\3\u0a82\3\u0a9e\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42"+ - "\3\u0b57\3\u0b62\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4"+ - "\3\u0cc2\3\u0cf4\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105"+ - "\3\u1128\3\u1152\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6"+ - "\3\u11dc\3\u11dc\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282"+ - "\3\u1288\3\u128a\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa"+ - "\3\u12b2\3\u12e0\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c"+ - "\3\u1332\3\u1334\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352"+ - "\3\u135f\3\u1363\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6"+ - "\3\u14c7\3\u14c9\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631"+ - "\3\u1646\3\u1646\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901"+ - "\3\u1901\3\u1a02\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52"+ - "\3\u1a5e\3\u1a85\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c"+ - "\3\u1c30\3\u1c42\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b"+ - "\3\u1d0d\3\u1d32\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002"+ - "\3\u3430\3\u4402\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef"+ - "\3\u6b02\3\u6b31\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02"+ - "\3\u6f46\3\u6f52\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee"+ - "\3\u8802\3\u8af4\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72"+ - "\3\ubc7e\3\ubc82\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e"+ - "\3\ud4a0\3\ud4a1\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0"+ - "\3\ud4bb\3\ud4bd\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c"+ - "\3\ud50f\3\ud516\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542"+ - "\3\ud546\3\ud548\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2"+ - "\3\ud6c4\3\ud6dc\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738"+ - "\3\ud750\3\ud752\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4"+ - "\3\ud7c6\3\ud7cd\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07"+ - "\3\uee21\3\uee23\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34"+ - "\3\uee36\3\uee39\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49"+ - "\3\uee49\3\uee4b\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54"+ - "\3\uee56\3\uee56\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f"+ - "\3\uee5f\3\uee61\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c"+ - "\3\uee6e\3\uee74\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82"+ - "\3\uee8b\3\uee8d\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd"+ - "\3\2\4\ua6d8\4\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4"+ - "\uebe2\4\uf802\4\ufa1f\4\u05e7\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n"+ - "\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2"+ - "\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\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\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2"+ - "\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D"+ - "\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2"+ - "\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2"+ - "\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2"+ - "j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3"+ - "\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082"+ - "\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2"+ - "\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094"+ - "\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2"+ - "\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6"+ - "\3\2\2\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2"+ - "\2\2\u00b0\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8"+ - "\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2"+ - "\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca"+ - "\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2"+ - "\2\2\u00d4\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc"+ - "\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2"+ - "\2\2\u00e6\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee"+ - "\3\2\2\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2"+ - "\2\2\u00f8\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100"+ - "\3\2\2\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2"+ - "\2\2\u010a\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112"+ - "\3\2\2\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u011c\3\2\2\2\2\u0120\3\2\2"+ - "\2\2\u0122\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a"+ - "\3\2\2\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2"+ - "\2\2\u0134\3\2\2\2\2\u0136\3\2\2\2\3\u014c\3\2\2\2\3\u014e\3\2\2\2\3\u0150"+ - "\3\2\2\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\4\u0158\3\2\2\2\6\u016e\3\2\2"+ - "\2\b\u0170\3\2\2\2\n\u0177\3\2\2\2\f\u017f\3\2\2\2\16\u0186\3\2\2\2\20"+ - "\u018d\3\2\2\2\22\u0194\3\2\2\2\24\u019b\3\2\2\2\26\u01a4\3\2\2\2\30\u01ae"+ - "\3\2\2\2\32\u01b6\3\2\2\2\34\u01c0\3\2\2\2\36\u01cc\3\2\2\2 \u01d3\3\2"+ - "\2\2\"\u01de\3\2\2\2$\u01e1\3\2\2\2&\u01e7\3\2\2\2(\u01f0\3\2\2\2*\u01f5"+ - "\3\2\2\2,\u01fc\3\2\2\2.\u0203\3\2\2\2\60\u0209\3\2\2\2\62\u020e\3\2\2"+ - "\2\64\u0215\3\2\2\2\66\u021f\3\2\2\28\u0225\3\2\2\2:\u0228\3\2\2\2<\u022a"+ - "\3\2\2\2>\u0231\3\2\2\2@\u0237\3\2\2\2B\u0244\3\2\2\2D\u024d\3\2\2\2F"+ - "\u0251\3\2\2\2H\u0255\3\2\2\2J\u025b\3\2\2\2L\u025d\3\2\2\2N\u0260\3\2"+ - "\2\2P\u0265\3\2\2\2R\u026b\3\2\2\2T\u0271\3\2\2\2V\u0278\3\2\2\2X\u027f"+ - "\3\2\2\2Z\u0288\3\2\2\2\\\u028e\3\2\2\2^\u0294\3\2\2\2`\u029b\3\2\2\2"+ - "b\u02a1\3\2\2\2d\u02a8\3\2\2\2f\u02ae\3\2\2\2h\u02b7\3\2\2\2j\u02bf\3"+ - "\2\2\2l\u02c6\3\2\2\2n\u02cb\3\2\2\2p\u02d4\3\2\2\2r\u02e3\3\2\2\2t\u02e9"+ - "\3\2\2\2v\u02ed\3\2\2\2x\u02f0\3\2\2\2z\u02f7\3\2\2\2|\u0301\3\2\2\2~"+ - "\u030b\3\2\2\2\u0080\u0317\3\2\2\2\u0082\u0320\3\2\2\2\u0084\u032a\3\2"+ - "\2\2\u0086\u0332\3\2\2\2\u0088\u033e\3\2\2\2\u008a\u034d\3\2\2\2\u008c"+ - "\u0353\3\2\2\2\u008e\u0357\3\2\2\2\u0090\u035b\3\2\2\2\u0092\u0363\3\2"+ - "\2\2\u0094\u036b\3\2\2\2\u0096\u0370\3\2\2\2\u0098\u037a\3\2\2\2\u009a"+ - "\u0381\3\2\2\2\u009c\u0386\3\2\2\2\u009e\u038c\3\2\2\2\u00a0\u038f\3\2"+ - "\2\2\u00a2\u0393\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u039f\3\2\2\2\u00a8"+ - "\u03a4\3\2\2\2\u00aa\u03a9\3\2\2\2\u00ac\u03b1\3\2\2\2\u00ae\u03b8\3\2"+ - "\2\2\u00b0\u03be\3\2\2\2\u00b2\u03cc\3\2\2\2\u00b4\u03cf\3\2\2\2\u00b6"+ - "\u03d5\3\2\2\2\u00b8\u03da\3\2\2\2\u00ba\u03e5\3\2\2\2\u00bc\u03e9\3\2"+ - "\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f9\3\2\2\2\u00c2\u03fd\3\2\2\2\u00c4"+ - "\u0403\3\2\2\2\u00c6\u040d\3\2\2\2\u00c8\u040f\3\2\2\2\u00ca\u0413\3\2"+ - "\2\2\u00cc\u0415\3\2\2\2\u00ce\u0419\3\2\2\2\u00d0\u041b\3\2\2\2\u00d2"+ - "\u041f\3\2\2\2\u00d4\u0421\3\2\2\2\u00d6\u0423\3\2\2\2\u00d8\u0425\3\2"+ - "\2\2\u00da\u0427\3\2\2\2\u00dc\u0429\3\2\2\2\u00de\u042e\3\2\2\2\u00e0"+ - "\u0433\3\2\2\2\u00e2\u0436\3\2\2\2\u00e4\u043a\3\2\2\2\u00e6\u043d\3\2"+ - "\2\2\u00e8\u0440\3\2\2\2\u00ea\u0443\3\2\2\2\u00ec\u0446\3\2\2\2\u00ee"+ - "\u0448\3\2\2\2\u00f0\u044b\3\2\2\2\u00f2\u044d\3\2\2\2\u00f4\u0450\3\2"+ - "\2\2\u00f6\u0452\3\2\2\2\u00f8\u0454\3\2\2\2\u00fa\u0456\3\2\2\2\u00fc"+ - "\u0459\3\2\2\2\u00fe\u045c\3\2\2\2\u0100\u045f\3\2\2\2\u0102\u0461\3\2"+ - "\2\2\u0104\u0463\3\2\2\2\u0106\u0465\3\2\2\2\u0108\u0467\3\2\2\2\u010a"+ - "\u0469\3\2\2\2\u010c\u046b\3\2\2\2\u010e\u0479\3\2\2\2\u0110\u047d\3\2"+ - "\2\2\u0112\u0489\3\2\2\2\u0114\u0497\3\2\2\2\u0116\u04a3\3\2\2\2\u0118"+ - "\u04c7\3\2\2\2\u011a\u04c9\3\2\2\2\u011c\u04d2\3\2\2\2\u011e\u04d8\3\2"+ - "\2\2\u0120\u04df\3\2\2\2\u0122\u04e5\3\2\2\2\u0124\u04e7\3\2\2\2\u0126"+ - "\u04ec\3\2\2\2\u0128\u04f1\3\2\2\2\u012a\u04f8\3\2\2\2\u012c\u0503\3\2"+ - "\2\2\u012e\u050e\3\2\2\2\u0130\u051b\3\2\2\2\u0132\u0521\3\2\2\2\u0134"+ - "\u0530\3\2\2\2\u0136\u0536\3\2\2\2\u0138\u0545\3\2\2\2\u013a\u0547\3\2"+ - "\2\2\u013c\u0563\3\2\2\2\u013e\u056d\3\2\2\2\u0140\u056f\3\2\2\2\u0142"+ - "\u0571\3\2\2\2\u0144\u0573\3\2\2\2\u0146\u057b\3\2\2\2\u0148\u057d\3\2"+ - "\2\2\u014a\u057f\3\2\2\2\u014c\u0582\3\2\2\2\u014e\u0588\3\2\2\2\u0150"+ - "\u0596\3\2\2\2\u0152\u05b3\3\2\2\2\u0154\u05b7\3\2\2\2\u0156\u0159\5\6"+ - "\3\2\u0157\u0159\5\u0116\u008b\2\u0158\u0156\3\2\2\2\u0158\u0157\3\2\2"+ - "\2\u0159\u015a\3\2\2\2\u015a\u015b\b\2\2\2\u015b\5\3\2\2\2\u015c\u0166"+ - "\5\u013c\u009e\2\u015d\u015e\7\60\2\2\u015e\u0160\6\3\2\2\u015f\u0161"+ - "\5\u013c\u009e\2\u0160\u015f\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0163\3"+ - "\2\2\2\u0162\u0164\5\u0144\u00a2\2\u0163\u0162\3\2\2\2\u0163\u0164\3\2"+ - "\2\2\u0164\u0167\3\2\2\2\u0165\u0167\5\u0144\u00a2\2\u0166\u015d\3\2\2"+ - "\2\u0166\u0165\3\2\2\2\u0167\u016f\3\2\2\2\u0168\u0169\7\60\2\2\u0169"+ - "\u016a\6\3\3\2\u016a\u016c\5\u013c\u009e\2\u016b\u016d\5\u0144\u00a2\2"+ - "\u016c\u016b\3\2\2\2\u016c\u016d\3\2\2\2\u016d\u016f\3\2\2\2\u016e\u015c"+ - "\3\2\2\2\u016e\u0168\3\2\2\2\u016f\7\3\2\2\2\u0170\u0171\7v\2\2\u0171"+ - "\u0172\7t\2\2\u0172\u0173\7w\2\2\u0173\u0174\7g\2\2\u0174\u0175\3\2\2"+ - "\2\u0175\u0176\b\4\2\2\u0176\t\3\2\2\2\u0177\u0178\7h\2\2\u0178\u0179"+ - "\7c\2\2\u0179\u017a\7n\2\2\u017a\u017b\7u\2\2\u017b\u017c\7g\2\2\u017c"+ - "\u017d\3\2\2\2\u017d\u017e\b\5\2\2\u017e\13\3\2\2\2\u017f\u0180\7c\2\2"+ - "\u0180\u0181\7u\2\2\u0181\u0182\7u\2\2\u0182\u0183\7g\2\2\u0183\u0184"+ - "\7t\2\2\u0184\u0185\7v\2\2\u0185\r\3\2\2\2\u0186\u0187\7c\2\2\u0187\u0188"+ - "\7u\2\2\u0188\u0189\7u\2\2\u0189\u018a\7w\2\2\u018a\u018b\7o\2\2\u018b"+ - "\u018c\7g\2\2\u018c\17\3\2\2\2\u018d\u018e\7k\2\2\u018e\u018f\7p\2\2\u018f"+ - "\u0190\7j\2\2\u0190\u0191\7c\2\2\u0191\u0192\7n\2\2\u0192\u0193\7g\2\2"+ - "\u0193\21\3\2\2\2\u0194\u0195\7g\2\2\u0195\u0196\7z\2\2\u0196\u0197\7"+ - "j\2\2\u0197\u0198\7c\2\2\u0198\u0199\7n\2\2\u0199\u019a\7g\2\2\u019a\23"+ - "\3\2\2\2\u019b\u019c\7t\2\2\u019c\u019d\7g\2\2\u019d\u019e\7s\2\2\u019e"+ - "\u019f\7w\2\2\u019f\u01a0\7k\2\2\u01a0\u01a1\7t\2\2\u01a1\u01a2\7g\2\2"+ - "\u01a2\u01a3\7u\2\2\u01a3\25\3\2\2\2\u01a4\u01a5\7r\2\2\u01a5\u01a6\7"+ - "t\2\2\u01a6\u01a7\7g\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa"+ - "\7t\2\2\u01aa\u01ab\7x\2\2\u01ab\u01ac\7g\2\2\u01ac\u01ad\7u\2\2\u01ad"+ - "\27\3\2\2\2\u01ae\u01af\7g\2\2\u01af\u01b0\7p\2\2\u01b0\u01b1\7u\2\2\u01b1"+ - "\u01b2\7w\2\2\u01b2\u01b3\7t\2\2\u01b3\u01b4\7g\2\2\u01b4\u01b5\7u\2\2"+ - "\u01b5\31\3\2\2\2\u01b6\u01b7\7k\2\2\u01b7\u01b8\7p\2\2\u01b8\u01b9\7"+ - "x\2\2\u01b9\u01ba\7c\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7k\2\2\u01bc\u01bd"+ - "\7c\2\2\u01bd\u01be\7p\2\2\u01be\u01bf\7v\2\2\u01bf\33\3\2\2\2\u01c0\u01c1"+ - "\7f\2\2\u01c1\u01c2\7g\2\2\u01c2\u01c3\7e\2\2\u01c3\u01c4\7t\2\2\u01c4"+ - "\u01c5\7g\2\2\u01c5\u01c6\7c\2\2\u01c6\u01c7\7u\2\2\u01c7\u01c8\7g\2\2"+ - "\u01c8\u01c9\7u\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cb\b\16\2\2\u01cb\35"+ - "\3\2\2\2\u01cc\u01cd\7r\2\2\u01cd\u01ce\7w\2\2\u01ce\u01cf\7t\2\2\u01cf"+ - "\u01d0\7g\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d2\b\17\2\2\u01d2\37\3\2\2"+ - "\2\u01d3\u01d4\7k\2\2\u01d4\u01d5\7o\2\2\u01d5\u01d6\7r\2\2\u01d6\u01d7"+ - "\7n\2\2\u01d7\u01d8\7g\2\2\u01d8\u01d9\7o\2\2\u01d9\u01da\7g\2\2\u01da"+ - "\u01db\7p\2\2\u01db\u01dc\7v\2\2\u01dc\u01dd\7u\2\2\u01dd!\3\2\2\2\u01de"+ - "\u01df\7c\2\2\u01df\u01e0\7u\2\2\u01e0#\3\2\2\2\u01e1\u01e2\7q\2\2\u01e2"+ - "\u01e3\7n\2\2\u01e3\u01e4\7f\2\2\u01e4\u01e5\3\2\2\2\u01e5\u01e6\b\22"+ - "\2\2\u01e6%\3\2\2\2\u01e7\u01e8\7d\2\2\u01e8\u01e9\7g\2\2\u01e9\u01ea"+ - "\7h\2\2\u01ea\u01eb\7q\2\2\u01eb\u01ec\7t\2\2\u01ec\u01ed\7g\2\2\u01ed"+ - "\u01ee\3\2\2\2\u01ee\u01ef\b\23\2\2\u01ef\'\3\2\2\2\u01f0\u01f1\7%\2\2"+ - "\u01f1\u01f2\7n\2\2\u01f2\u01f3\7j\2\2\u01f3\u01f4\7u\2\2\u01f4)\3\2\2"+ - "\2\u01f5\u01f6\7h\2\2\u01f6\u01f7\7q\2\2\u01f7\u01f8\7t\2\2\u01f8\u01f9"+ - "\7c\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7n\2\2\u01fb+\3\2\2\2\u01fc\u01fd"+ - "\7g\2\2\u01fd\u01fe\7z\2\2\u01fe\u01ff\7k\2\2\u01ff\u0200\7u\2\2\u0200"+ - "\u0201\7v\2\2\u0201\u0202\7u\2\2\u0202-\3\2\2\2\u0203\u0204\7c\2\2\u0204"+ - "\u0205\7e\2\2\u0205\u0206\7e\2\2\u0206\u0207\3\2\2\2\u0207\u0208\b\27"+ - "\2\2\u0208/\3\2\2\2\u0209\u020a\7h\2\2\u020a\u020b\7q\2\2\u020b\u020c"+ - "\7n\2\2\u020c\u020d\7f\2\2\u020d\61\3\2\2\2\u020e\u020f\7w\2\2\u020f\u0210"+ - "\7p\2\2\u0210\u0211\7h\2\2\u0211\u0212\7q\2\2\u0212\u0213\7n\2\2\u0213"+ - "\u0214\7f\2\2\u0214\63\3\2\2\2\u0215\u0216\7w\2\2\u0216\u0217\7p\2\2\u0217"+ - "\u0218\7h\2\2\u0218\u0219\7q\2\2\u0219\u021a\7n\2\2\u021a\u021b\7f\2\2"+ - "\u021b\u021c\7k\2\2\u021c\u021d\7p\2\2\u021d\u021e\7i\2\2\u021e\65\3\2"+ - "\2\2\u021f\u0220\7i\2\2\u0220\u0221\7j\2\2\u0221\u0222\7q\2\2\u0222\u0223"+ - "\7u\2\2\u0223\u0224\7v\2\2\u0224\67\3\2\2\2\u0225\u0226\7k\2\2\u0226\u0227"+ - "\7p\2\2\u02279\3\2\2\2\u0228\u0229\7%\2\2\u0229;\3\2\2\2\u022a\u022b\7"+ - "u\2\2\u022b\u022c\7w\2\2\u022c\u022d\7d\2\2\u022d\u022e\7u\2\2\u022e\u022f"+ - "\7g\2\2\u022f\u0230\7v\2\2\u0230=\3\2\2\2\u0231\u0232\7w\2\2\u0232\u0233"+ - "\7p\2\2\u0233\u0234\7k\2\2\u0234\u0235\7q\2\2\u0235\u0236\7p\2\2\u0236"+ - "?\3\2\2\2\u0237\u0238\7k\2\2\u0238\u0239\7p\2\2\u0239\u023a\7v\2\2\u023a"+ - "\u023b\7g\2\2\u023b\u023c\7t\2\2\u023c\u023d\7u\2\2\u023d\u023e\7g\2\2"+ - "\u023e\u023f\7e\2\2\u023f\u0240\7v\2\2\u0240\u0241\7k\2\2\u0241\u0242"+ - "\7q\2\2\u0242\u0243\7p\2\2\u0243A\3\2\2\2\u0244\u0245\7u\2\2\u0245\u0246"+ - "\7g\2\2\u0246\u0247\7v\2\2\u0247\u0248\7o\2\2\u0248\u0249\7k\2\2\u0249"+ - "\u024a\7p\2\2\u024a\u024b\7w\2\2\u024b\u024c\7u\2\2\u024cC\3\2\2\2\u024d"+ - "\u024e\7?\2\2\u024e\u024f\7?\2\2\u024f\u0250\7@\2\2\u0250E\3\2\2\2\u0251"+ - "\u0252\7/\2\2\u0252\u0253\7/\2\2\u0253\u0254\7,\2\2\u0254G\3\2\2\2\u0255"+ - "\u0256\7c\2\2\u0256\u0257\7r\2\2\u0257\u0258\7r\2\2\u0258\u0259\7n\2\2"+ - "\u0259\u025a\7{\2\2\u025aI\3\2\2\2\u025b\u025c\7A\2\2\u025cK\3\2\2\2\u025d"+ - "\u025e\7#\2\2\u025e\u025f\7>\2\2\u025fM\3\2\2\2\u0260\u0261\7#\2\2\u0261"+ - "\u0262\7@\2\2\u0262\u0263\3\2\2\2\u0263\u0264\b\'\2\2\u0264O\3\2\2\2\u0265"+ - "\u0266\7u\2\2\u0266\u0267\7g\2\2\u0267\u0268\7s\2\2\u0268\u0269\3\2\2"+ - "\2\u0269\u026a\b(\2\2\u026aQ\3\2\2\2\u026b\u026c\7u\2\2\u026c\u026d\7"+ - "g\2\2\u026d\u026e\7v\2\2\u026e\u026f\3\2\2\2\u026f\u0270\b)\2\2\u0270"+ - "S\3\2\2\2\u0271\u0272\7o\2\2\u0272\u0273\7u\2\2\u0273\u0274\7g\2\2\u0274"+ - "\u0275\7v\2\2\u0275\u0276\3\2\2\2\u0276\u0277\b*\2\2\u0277U\3\2\2\2\u0278"+ - "\u0279\7f\2\2\u0279\u027a\7k\2\2\u027a\u027b\7e\2\2\u027b\u027c\7v\2\2"+ - "\u027c\u027d\3\2\2\2\u027d\u027e\b+\2\2\u027eW\3\2\2\2\u027f\u0280\7q"+ - "\2\2\u0280\u0281\7r\2\2\u0281\u0282\7v\2\2\u0282\u0283\7k\2\2\u0283\u0284"+ - "\7q\2\2\u0284\u0285\7p\2\2\u0285\u0286\3\2\2\2\u0286\u0287\b,\2\2\u0287"+ - "Y\3\2\2\2\u0288\u0289\7n\2\2\u0289\u028a\7g\2\2\u028a\u028b\7p\2\2\u028b"+ - "\u028c\3\2\2\2\u028c\u028d\b-\2\2\u028d[\3\2\2\2\u028e\u028f\7p\2\2\u028f"+ - "\u0290\7g\2\2\u0290\u0291\7y\2\2\u0291\u0292\3\2\2\2\u0292\u0293\b.\2"+ - "\2\u0293]\3\2\2\2\u0294\u0295\7o\2\2\u0295\u0296\7c\2\2\u0296\u0297\7"+ - "m\2\2\u0297\u0298\7g\2\2\u0298\u0299\3\2\2\2\u0299\u029a\b/\2\2\u029a"+ - "_\3\2\2\2\u029b\u029c\7e\2\2\u029c\u029d\7c\2\2\u029d\u029e\7r\2\2\u029e"+ - "\u029f\3\2\2\2\u029f\u02a0\b\60\2\2\u02a0a\3\2\2\2\u02a1\u02a2\7u\2\2"+ - "\u02a2\u02a3\7q\2\2\u02a3\u02a4\7o\2\2\u02a4\u02a5\7g\2\2\u02a5\u02a6"+ - "\3\2\2\2\u02a6\u02a7\b\61\2\2\u02a7c\3\2\2\2\u02a8\u02a9\7i\2\2\u02a9"+ - "\u02aa\7g\2\2\u02aa\u02ab\7v\2\2\u02ab\u02ac\3\2\2\2\u02ac\u02ad\b\62"+ - "\2\2\u02ade\3\2\2\2\u02ae\u02af\7f\2\2\u02af\u02b0\7q\2\2\u02b0\u02b1"+ - "\7o\2\2\u02b1\u02b2\7c\2\2\u02b2\u02b3\7k\2\2\u02b3\u02b4\7p\2\2\u02b4"+ - "\u02b5\3\2\2\2\u02b5\u02b6\b\63\2\2\u02b6g\3\2\2\2\u02b7\u02b8\7c\2\2"+ - "\u02b8\u02b9\7z\2\2\u02b9\u02ba\7k\2\2\u02ba\u02bb\7q\2\2\u02bb\u02bc"+ - "\7o\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\b\64\2\2\u02bei\3\2\2\2\u02bf"+ - "\u02c0\7p\2\2\u02c0\u02c1\7q\2\2\u02c1\u02c2\7p\2\2\u02c2\u02c3\7g\2\2"+ - "\u02c3\u02c4\3\2\2\2\u02c4\u02c5\b\65\2\2\u02c5k\3\2\2\2\u02c6\u02c7\7"+ - "r\2\2\u02c7\u02c8\7t\2\2\u02c8\u02c9\7g\2\2\u02c9\u02ca\7f\2\2\u02cam"+ - "\3\2\2\2\u02cb\u02cc\7v\2\2\u02cc\u02cd\7{\2\2\u02cd\u02ce\7r\2\2\u02ce"+ - "\u02cf\7g\2\2\u02cf\u02d0\7Q\2\2\u02d0\u02d1\7h\2\2\u02d1\u02d2\3\2\2"+ - "\2\u02d2\u02d3\b\67\2\2\u02d3o\3\2\2\2\u02d4\u02d5\7k\2\2\u02d5\u02d6"+ - "\7u\2\2\u02d6\u02d7\7E\2\2\u02d7\u02d8\7q\2\2\u02d8\u02d9\7o\2\2\u02d9"+ - "\u02da\7r\2\2\u02da\u02db\7c\2\2\u02db\u02dc\7t\2\2\u02dc\u02dd\7c\2\2"+ - "\u02dd\u02de\7d\2\2\u02de\u02df\7n\2\2\u02df\u02e0\7g\2\2\u02e0\u02e1"+ - "\3\2\2\2\u02e1\u02e2\b8\2\2\u02e2q\3\2\2\2\u02e3\u02e4\7u\2\2\u02e4\u02e5"+ - "\7j\2\2\u02e5\u02e6\7c\2\2\u02e6\u02e7\7t\2\2\u02e7\u02e8\7g\2\2\u02e8"+ - "s\3\2\2\2\u02e9\u02ea\7B\2\2\u02ea\u02eb\3\2\2\2\u02eb\u02ec\b:\2\2\u02ec"+ - "u\3\2\2\2\u02ed\u02ee\7\60\2\2\u02ee\u02ef\7\60\2\2\u02efw\3\2\2\2\u02f0"+ - "\u02f1\7u\2\2\u02f1\u02f2\7j\2\2\u02f2\u02f3\7c\2\2\u02f3\u02f4\7t\2\2"+ - "\u02f4\u02f5\7g\2\2\u02f5\u02f6\7f\2\2\u02f6y\3\2\2\2\u02f7\u02f8\7g\2"+ - "\2\u02f8\u02f9\7z\2\2\u02f9\u02fa\7e\2\2\u02fa\u02fb\7n\2\2\u02fb\u02fc"+ - "\7w\2\2\u02fc\u02fd\7u\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7x\2\2\u02ff"+ - "\u0300\7g\2\2\u0300{\3\2\2\2\u0301\u0302\7r\2\2\u0302\u0303\7t\2\2\u0303"+ - "\u0304\7g\2\2\u0304\u0305\7f\2\2\u0305\u0306\7k\2\2\u0306\u0307\7e\2\2"+ - "\u0307\u0308\7c\2\2\u0308\u0309\7v\2\2\u0309\u030a\7g\2\2\u030a}\3\2\2"+ - "\2\u030b\u030c\7y\2\2\u030c\u030d\7t\2\2\u030d\u030e\7k\2\2\u030e\u030f"+ - "\7v\2\2\u030f\u0310\7g\2\2\u0310\u0311\7R\2\2\u0311\u0312\7g\2\2\u0312"+ - "\u0313\7t\2\2\u0313\u0314\7o\2\2\u0314\u0315\3\2\2\2\u0315\u0316\b?\2"+ - "\2\u0316\177\3\2\2\2\u0317\u0318\7p\2\2\u0318\u0319\7q\2\2\u0319\u031a"+ - "\7R\2\2\u031a\u031b\7g\2\2\u031b\u031c\7t\2\2\u031c\u031d\7o\2\2\u031d"+ - "\u031e\3\2\2\2\u031e\u031f\b@\2\2\u031f\u0081\3\2\2\2\u0320\u0321\7v\2"+ - "\2\u0321\u0322\7t\2\2\u0322\u0323\7w\2\2\u0323\u0324\7u\2\2\u0324\u0325"+ - "\7v\2\2\u0325\u0326\7g\2\2\u0326\u0327\7f\2\2\u0327\u0328\3\2\2\2\u0328"+ - "\u0329\bA\2\2\u0329\u0083\3\2\2\2\u032a\u032b\7q\2\2\u032b\u032c\7w\2"+ - "\2\u032c\u032d\7v\2\2\u032d\u032e\7n\2\2\u032e\u032f\7k\2\2\u032f\u0330"+ - "\7p\2\2\u0330\u0331\7g\2\2\u0331\u0085\3\2\2\2\u0332\u0333\7k\2\2\u0333"+ - "\u0334\7p\2\2\u0334\u0335\7k\2\2\u0335\u0336\7v\2\2\u0336\u0337\7G\2\2"+ - "\u0337\u0338\7p\2\2\u0338\u0339\7u\2\2\u0339\u033a\7w\2\2\u033a\u033b"+ - "\7t\2\2\u033b\u033c\7g\2\2\u033c\u033d\7u\2\2\u033d\u0087\3\2\2\2\u033e"+ - "\u033f\7k\2\2\u033f\u0340\7o\2\2\u0340\u0341\7r\2\2\u0341\u0342\7q\2\2"+ - "\u0342\u0343\7t\2\2\u0343\u0344\7v\2\2\u0344\u0345\7T\2\2\u0345\u0346"+ - "\7g\2\2\u0346\u0347\7s\2\2\u0347\u0348\7w\2\2\u0348\u0349\7k\2\2\u0349"+ - "\u034a\7t\2\2\u034a\u034b\7g\2\2\u034b\u034c\7u\2\2\u034c\u0089\3\2\2"+ - "\2\u034d\u034e\7r\2\2\u034e\u034f\7t\2\2\u034f\u0350\7q\2\2\u0350\u0351"+ - "\7q\2\2\u0351\u0352\7h\2\2\u0352\u008b\3\2\2\2\u0353\u0354\7?\2\2\u0354"+ - "\u0355\7?\2\2\u0355\u0356\7?\2\2\u0356\u008d\3\2\2\2\u0357\u0358\7#\2"+ - "\2\u0358\u0359\7?\2\2\u0359\u035a\7?\2\2\u035a\u008f\3\2\2\2\u035b\u035c"+ - "\7d\2\2\u035c\u035d\7t\2\2\u035d\u035e\7g\2\2\u035e\u035f\7c\2\2\u035f"+ - "\u0360\7m\2\2\u0360\u0361\3\2\2\2\u0361\u0362\bH\2\2\u0362\u0091\3\2\2"+ - "\2\u0363\u0364\7f\2\2\u0364\u0365\7g\2\2\u0365\u0366\7h\2\2\u0366\u0367"+ - "\7c\2\2\u0367\u0368\7w\2\2\u0368\u0369\7n\2\2\u0369\u036a\7v\2\2\u036a"+ - "\u0093\3\2\2\2\u036b\u036c\7h\2\2\u036c\u036d\7w\2\2\u036d\u036e\7p\2"+ - "\2\u036e\u036f\7e\2\2\u036f\u0095\3\2\2\2\u0370\u0371\7k\2\2\u0371\u0372"+ - "\7p\2\2\u0372\u0373\7v\2\2\u0373\u0374\7g\2\2\u0374\u0375\7t\2\2\u0375"+ - "\u0376\7h\2\2\u0376\u0377\7c\2\2\u0377\u0378\7e\2\2\u0378\u0379\7g\2\2"+ - "\u0379\u0097\3\2\2\2\u037a\u037b\7u\2\2\u037b\u037c\7g\2\2\u037c\u037d"+ - "\7n\2\2\u037d\u037e\7g\2\2\u037e\u037f\7e\2\2\u037f\u0380\7v\2\2\u0380"+ - "\u0099\3\2\2\2\u0381\u0382\7e\2\2\u0382\u0383\7c\2\2\u0383\u0384\7u\2"+ - "\2\u0384\u0385\7g\2\2\u0385\u009b\3\2\2\2\u0386\u0387\7f\2\2\u0387\u0388"+ - "\7g\2\2\u0388\u0389\7h\2\2\u0389\u038a\7g\2\2\u038a\u038b\7t\2\2\u038b"+ - "\u009d\3\2\2\2\u038c\u038d\7i\2\2\u038d\u038e\7q\2\2\u038e\u009f\3\2\2"+ - "\2\u038f\u0390\7o\2\2\u0390\u0391\7c\2\2\u0391\u0392\7r\2\2\u0392\u00a1"+ - "\3\2\2\2\u0393\u0394\7u\2\2\u0394\u0395\7v\2\2\u0395\u0396\7t\2\2\u0396"+ - "\u0397\7w\2\2\u0397\u0398\7e\2\2\u0398\u0399\7v\2\2\u0399\u00a3\3\2\2"+ - "\2\u039a\u039b\7e\2\2\u039b\u039c\7j\2\2\u039c\u039d\7c\2\2\u039d\u039e"+ - "\7p\2\2\u039e\u00a5\3\2\2\2\u039f\u03a0\7g\2\2\u03a0\u03a1\7n\2\2\u03a1"+ - "\u03a2\7u\2\2\u03a2\u03a3\7g\2\2\u03a3\u00a7\3\2\2\2\u03a4\u03a5\7i\2"+ - "\2\u03a5\u03a6\7q\2\2\u03a6\u03a7\7v\2\2\u03a7\u03a8\7q\2\2\u03a8\u00a9"+ - "\3\2\2\2\u03a9\u03aa\7r\2\2\u03aa\u03ab\7c\2\2\u03ab\u03ac\7e\2\2\u03ac"+ - "\u03ad\7m\2\2\u03ad\u03ae\7c\2\2\u03ae\u03af\7i\2\2\u03af\u03b0\7g\2\2"+ - "\u03b0\u00ab\3\2\2\2\u03b1\u03b2\7u\2\2\u03b2\u03b3\7y\2\2\u03b3\u03b4"+ - "\7k\2\2\u03b4\u03b5\7v\2\2\u03b5\u03b6\7e\2\2\u03b6\u03b7\7j\2\2\u03b7"+ - "\u00ad\3\2\2\2\u03b8\u03b9\7e\2\2\u03b9\u03ba\7q\2\2\u03ba\u03bb\7p\2"+ - "\2\u03bb\u03bc\7u\2\2\u03bc\u03bd\7v\2\2\u03bd\u00af\3\2\2\2\u03be\u03bf"+ - "\7h\2\2\u03bf\u03c0\7c\2\2\u03c0\u03c1\7n\2\2\u03c1\u03c2\7n\2\2\u03c2"+ - "\u03c3\7v\2\2\u03c3\u03c4\7j\2\2\u03c4\u03c5\7t\2\2\u03c5\u03c6\7q\2\2"+ - "\u03c6\u03c7\7w\2\2\u03c7\u03c8\7i\2\2\u03c8\u03c9\7j\2\2\u03c9\u03ca"+ - "\3\2\2\2\u03ca\u03cb\bX\2\2\u03cb\u00b1\3\2\2\2\u03cc\u03cd\7k\2\2\u03cd"+ - "\u03ce\7h\2\2\u03ce\u00b3\3\2\2\2\u03cf\u03d0\7t\2\2\u03d0\u03d1\7c\2"+ - "\2\u03d1\u03d2\7p\2\2\u03d2\u03d3\7i\2\2\u03d3\u03d4\7g\2\2\u03d4\u00b5"+ - "\3\2\2\2\u03d5\u03d6\7v\2\2\u03d6\u03d7\7{\2\2\u03d7\u03d8\7r\2\2\u03d8"+ - "\u03d9\7g\2\2\u03d9\u00b7\3\2\2\2\u03da\u03db\7e\2\2\u03db\u03dc\7q\2"+ - "\2\u03dc\u03dd\7p\2\2\u03dd\u03de\7v\2\2\u03de\u03df\7k\2\2\u03df\u03e0"+ - "\7p\2\2\u03e0\u03e1\7w\2\2\u03e1\u03e2\7g\2\2\u03e2\u03e3\3\2\2\2\u03e3"+ - "\u03e4\b\\\2\2\u03e4\u00b9\3\2\2\2\u03e5\u03e6\7h\2\2\u03e6\u03e7\7q\2"+ - "\2\u03e7\u03e8\7t\2\2\u03e8\u00bb\3\2\2\2\u03e9\u03ea\7k\2\2\u03ea\u03eb"+ - "\7o\2\2\u03eb\u03ec\7r\2\2\u03ec\u03ed\7q\2\2\u03ed\u03ee\7t\2\2\u03ee"+ - "\u03ef\7v\2\2\u03ef\u00bd\3\2\2\2\u03f0\u03f1\7t\2\2\u03f1\u03f2\7g\2"+ - "\2\u03f2\u03f3\7v\2\2\u03f3\u03f4\7w\2\2\u03f4\u03f5\7t\2\2\u03f5\u03f6"+ - "\7p\2\2\u03f6\u03f7\3\2\2\2\u03f7\u03f8\b_\2\2\u03f8\u00bf\3\2\2\2\u03f9"+ - "\u03fa\7x\2\2\u03fa\u03fb\7c\2\2\u03fb\u03fc\7t\2\2\u03fc\u00c1\3\2\2"+ - "\2\u03fd\u03fe\7p\2\2\u03fe\u03ff\7k\2\2\u03ff\u0400\7n\2\2\u0400\u0401"+ - "\3\2\2\2\u0401\u0402\ba\2\2\u0402\u00c3\3\2\2\2\u0403\u0408\5\u0146\u00a3"+ - "\2\u0404\u0407\5\u0146\u00a3\2\u0405\u0407\5\u0148\u00a4\2\u0406\u0404"+ - "\3\2\2\2\u0406\u0405\3\2\2\2\u0407\u040a\3\2\2\2\u0408\u0406\3\2\2\2\u0408"+ - "\u0409\3\2\2\2\u0409\u040b\3\2\2\2\u040a\u0408\3\2\2\2\u040b\u040c\bb"+ - "\2\2\u040c\u00c5\3\2\2\2\u040d\u040e\7*\2\2\u040e\u00c7\3\2\2\2\u040f"+ - "\u0410\7+\2\2\u0410\u0411\3\2\2\2\u0411\u0412\bd\2\2\u0412\u00c9\3\2\2"+ - "\2\u0413\u0414\7}\2\2\u0414\u00cb\3\2\2\2\u0415\u0416\7\177\2\2\u0416"+ - "\u0417\3\2\2\2\u0417\u0418\bf\2\2\u0418\u00cd\3\2\2\2\u0419\u041a\7]\2"+ - "\2\u041a\u00cf\3\2\2\2\u041b\u041c\7_\2\2\u041c\u041d\3\2\2\2\u041d\u041e"+ - "\bh\2\2\u041e\u00d1\3\2\2\2\u041f\u0420\7?\2\2\u0420\u00d3\3\2\2\2\u0421"+ - "\u0422\7.\2\2\u0422\u00d5\3\2\2\2\u0423\u0424\7=\2\2\u0424\u00d7\3\2\2"+ - "\2\u0425\u0426\7<\2\2\u0426\u00d9\3\2\2\2\u0427\u0428\7\60\2\2\u0428\u00db"+ - "\3\2\2\2\u0429\u042a\7-\2\2\u042a\u042b\7-\2\2\u042b\u042c\3\2\2\2\u042c"+ - "\u042d\bn\2\2\u042d\u00dd\3\2\2\2\u042e\u042f\7/\2\2\u042f\u0430\7/\2"+ - "\2\u0430\u0431\3\2\2\2\u0431\u0432\bo\2\2\u0432\u00df\3\2\2\2\u0433\u0434"+ - "\7<\2\2\u0434\u0435\7?\2\2\u0435\u00e1\3\2\2\2\u0436\u0437\7\60\2\2\u0437"+ - "\u0438\7\60\2\2\u0438\u0439\7\60\2\2\u0439\u00e3\3\2\2\2\u043a\u043b\7"+ - "~\2\2\u043b\u043c\7~\2\2\u043c\u00e5\3\2\2\2\u043d\u043e\7(\2\2\u043e"+ - "\u043f\7(\2\2\u043f\u00e7\3\2\2\2\u0440\u0441\7?\2\2\u0441\u0442\7?\2"+ - "\2\u0442\u00e9\3\2\2\2\u0443\u0444\7#\2\2\u0444\u0445\7?\2\2\u0445\u00eb"+ - "\3\2\2\2\u0446\u0447\7>\2\2\u0447\u00ed\3\2\2\2\u0448\u0449\7>\2\2\u0449"+ - "\u044a\7?\2\2\u044a\u00ef\3\2\2\2\u044b\u044c\7@\2\2\u044c\u00f1\3\2\2"+ - "\2\u044d\u044e\7@\2\2\u044e\u044f\7?\2\2\u044f\u00f3\3\2\2\2\u0450\u0451"+ - "\7~\2\2\u0451\u00f5\3\2\2\2\u0452\u0453\7\61\2\2\u0453\u00f7\3\2\2\2\u0454"+ - "\u0455\7\'\2\2\u0455\u00f9\3\2\2\2\u0456\u0457\7>\2\2\u0457\u0458\7>\2"+ - "\2\u0458\u00fb\3\2\2\2\u0459\u045a\7@\2\2\u045a\u045b\7@\2\2\u045b\u00fd"+ - "\3\2\2\2\u045c\u045d\7(\2\2\u045d\u045e\7`\2\2\u045e\u00ff\3\2\2\2\u045f"+ - "\u0460\7#\2\2\u0460\u0101\3\2\2\2\u0461\u0462\7-\2\2\u0462\u0103\3\2\2"+ - "\2\u0463\u0464\7/\2\2\u0464\u0105\3\2\2\2\u0465\u0466\7`\2\2\u0466\u0107"+ - "\3\2\2\2\u0467\u0468\7,\2\2\u0468\u0109\3\2\2\2\u0469\u046a\7(\2\2\u046a"+ - "\u010b\3\2\2\2\u046b\u046c\7>\2\2\u046c\u046d\7/\2\2\u046d\u010d\3\2\2"+ - "\2\u046e\u047a\7\62\2\2\u046f\u0476\t\2\2\2\u0470\u0472\7a\2\2\u0471\u0470"+ - "\3\2\2\2\u0471\u0472\3\2\2\2\u0472\u0473\3\2\2\2\u0473\u0475\t\3\2\2\u0474"+ - "\u0471\3\2\2\2\u0475\u0478\3\2\2\2\u0476\u0474\3\2\2\2\u0476\u0477\3\2"+ - "\2\2\u0477\u047a\3\2\2\2\u0478\u0476\3\2\2\2\u0479\u046e\3\2\2\2\u0479"+ - "\u046f\3\2\2\2\u047a\u047b\3\2\2\2\u047b\u047c\b\u0087\2\2\u047c\u010f"+ - "\3\2\2\2\u047d\u047e\7\62\2\2\u047e\u0483\t\4\2\2\u047f\u0481\7a\2\2\u0480"+ - "\u047f\3\2\2\2\u0480\u0481\3\2\2\2\u0481\u0482\3\2\2\2\u0482\u0484\5\u0142"+ - "\u00a1\2\u0483\u0480\3\2\2\2\u0484\u0485\3\2\2\2\u0485\u0483\3\2\2\2\u0485"+ - "\u0486\3\2\2\2\u0486\u0487\3\2\2\2\u0487\u0488\b\u0088\2\2\u0488\u0111"+ - "\3\2\2\2\u0489\u048b\7\62\2\2\u048a\u048c\t\5\2\2\u048b\u048a\3\2\2\2"+ - "\u048b\u048c\3\2\2\2\u048c\u0491\3\2\2\2\u048d\u048f\7a\2\2\u048e\u048d"+ - "\3\2\2\2\u048e\u048f\3\2\2\2\u048f\u0490\3\2\2\2\u0490\u0492\5\u013e\u009f"+ - "\2\u0491\u048e\3\2\2\2\u0492\u0493\3\2\2\2\u0493\u0491\3\2\2\2\u0493\u0494"+ - "\3\2\2\2\u0494\u0495\3\2\2\2\u0495\u0496\b\u0089\2\2\u0496\u0113\3\2\2"+ - "\2\u0497\u0498\7\62\2\2\u0498\u049d\t\6\2\2\u0499\u049b\7a\2\2\u049a\u0499"+ - "\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u049c\3\2\2\2\u049c\u049e\5\u0140\u00a0"+ - "\2\u049d\u049a\3\2\2\2\u049e\u049f\3\2\2\2\u049f\u049d\3\2\2\2\u049f\u04a0"+ - "\3\2\2\2\u04a0\u04a1\3\2\2\2\u04a1\u04a2\b\u008a\2\2\u04a2\u0115\3\2\2"+ - "\2\u04a3\u04a4\7\62\2\2\u04a4\u04a5\t\6\2\2\u04a5\u04a6\5\u0118\u008c"+ - "\2\u04a6\u04a7\5\u011a\u008d\2\u04a7\u0117\3\2\2\2\u04a8\u04aa\7a\2\2"+ - "\u04a9\u04a8\3\2\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\3\2\2\2\u04ab\u04ad"+ - "\5\u0140\u00a0\2\u04ac\u04a9\3\2\2\2\u04ad\u04ae\3\2\2\2\u04ae\u04ac\3"+ - "\2\2\2\u04ae\u04af\3\2\2\2\u04af\u04ba\3\2\2\2\u04b0\u04b7\7\60\2\2\u04b1"+ - "\u04b3\7a\2\2\u04b2\u04b1\3\2\2\2\u04b2\u04b3\3\2\2\2\u04b3\u04b4\3\2"+ - "\2\2\u04b4\u04b6\5\u0140\u00a0\2\u04b5\u04b2\3\2\2\2\u04b6\u04b9\3\2\2"+ - "\2\u04b7\u04b5\3\2\2\2\u04b7\u04b8\3\2\2\2\u04b8\u04bb\3\2\2\2\u04b9\u04b7"+ - "\3\2\2\2\u04ba\u04b0\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04c8\3\2\2\2\u04bc"+ - "\u04bd\7\60\2\2\u04bd\u04c4\5\u0140\u00a0\2\u04be\u04c0\7a\2\2\u04bf\u04be"+ - "\3\2\2\2\u04bf\u04c0\3\2\2\2\u04c0\u04c1\3\2\2\2\u04c1\u04c3\5\u0140\u00a0"+ - "\2\u04c2\u04bf\3\2\2\2\u04c3\u04c6\3\2\2\2\u04c4\u04c2\3\2\2\2\u04c4\u04c5"+ - "\3\2\2\2\u04c5\u04c8\3\2\2\2\u04c6\u04c4\3\2\2\2\u04c7\u04ac\3\2\2\2\u04c7"+ - "\u04bc\3\2\2\2\u04c8\u0119\3\2\2\2\u04c9\u04ca\t\7\2\2\u04ca\u04cb\t\b"+ - "\2\2\u04cb\u04cc\5\u013c\u009e\2\u04cc\u011b\3\2\2\2\u04cd\u04d3\5\u010e"+ - "\u0087\2\u04ce\u04d3\5\u0110\u0088\2\u04cf\u04d3\5\u0112\u0089\2\u04d0"+ - "\u04d3\5\u0114\u008a\2\u04d1\u04d3\5\4\2\2\u04d2\u04cd\3\2\2\2\u04d2\u04ce"+ - "\3\2\2\2\u04d2\u04cf\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d2\u04d1\3\2\2\2\u04d3"+ - "\u04d4\3\2\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d7\b\u008e"+ - "\2\2\u04d7\u011d\3\2\2\2\u04d8\u04db\7)\2\2\u04d9\u04dc\5\u0138\u009c"+ - "\2\u04da\u04dc\5\u0122\u0091\2\u04db\u04d9\3\2\2\2\u04db\u04da\3\2\2\2"+ - "\u04dc\u04dd\3\2\2\2\u04dd\u04de\7)\2\2\u04de\u011f\3\2\2\2\u04df\u04e0"+ - "\5\u011e\u008f\2\u04e0\u04e1\3\2\2\2\u04e1\u04e2\b\u0090\2\2\u04e2\u0121"+ - "\3\2\2\2\u04e3\u04e6\5\u0124\u0092\2\u04e4\u04e6\5\u0126\u0093\2\u04e5"+ - "\u04e3\3\2\2\2\u04e5\u04e4\3\2\2\2\u04e6\u0123\3\2\2\2\u04e7\u04e8\7^"+ - "\2\2\u04e8\u04e9\5\u013e\u009f\2\u04e9\u04ea\5\u013e\u009f\2\u04ea\u04eb"+ - "\5\u013e\u009f\2\u04eb\u0125\3\2\2\2\u04ec\u04ed\7^\2\2\u04ed\u04ee\7"+ - "z\2\2\u04ee\u04ef\5\u0140\u00a0\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u0127"+ - "\3\2\2\2\u04f1\u04f2\7^\2\2\u04f2\u04f3\7w\2\2\u04f3\u04f4\5\u0140\u00a0"+ - "\2\u04f4\u04f5\5\u0140\u00a0\2\u04f5\u04f6\5\u0140\u00a0\2\u04f6\u04f7"+ - "\5\u0140\u00a0\2\u04f7\u0129\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7"+ - "W\2\2\u04fa\u04fb\5\u0140\u00a0\2\u04fb\u04fc\5\u0140\u00a0\2\u04fc\u04fd"+ - "\5\u0140\u00a0\2\u04fd\u04fe\5\u0140\u00a0\2\u04fe\u04ff\5\u0140\u00a0"+ - "\2\u04ff\u0500\5\u0140\u00a0\2\u0500\u0501\5\u0140\u00a0\2\u0501\u0502"+ - "\5\u0140\u00a0\2\u0502\u012b\3\2\2\2\u0503\u0507\7b\2\2\u0504\u0506\n"+ - "\t\2\2\u0505\u0504\3\2\2\2\u0506\u0509\3\2\2\2\u0507\u0505\3\2\2\2\u0507"+ - "\u0508\3\2\2\2\u0508\u050a\3\2\2\2\u0509\u0507\3\2\2\2\u050a\u050b\7b"+ - "\2\2\u050b\u050c\3\2\2\2\u050c\u050d\b\u0096\2\2\u050d\u012d\3\2\2\2\u050e"+ - "\u0513\7$\2\2\u050f\u0512\n\n\2\2\u0510\u0512\5\u013a\u009d\2\u0511\u050f"+ - "\3\2\2\2\u0511\u0510\3\2\2\2\u0512\u0515\3\2\2\2\u0513\u0511\3\2\2\2\u0513"+ - "\u0514\3\2\2\2\u0514\u0516\3\2\2\2\u0515\u0513\3\2\2\2\u0516\u0517\7$"+ - "\2\2\u0517\u0518\3\2\2\2\u0518\u0519\b\u0097\2\2\u0519\u012f\3\2\2\2\u051a"+ - "\u051c\t\13\2\2\u051b\u051a\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051b\3"+ - "\2\2\2\u051d\u051e\3\2\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\3\2"+ - "\u0520\u0131\3\2\2\2\u0521\u0522\7\61\2\2\u0522\u0523\7,\2\2\u0523\u0527"+ - "\3\2\2\2\u0524\u0526\13\2\2\2\u0525\u0524\3\2\2\2\u0526\u0529\3\2\2\2"+ - "\u0527\u0528\3\2\2\2\u0527\u0525\3\2\2\2\u0528\u052a\3\2\2\2\u0529\u0527"+ - "\3\2\2\2\u052a\u052b\7,\2\2\u052b\u052c\7\61\2\2\u052c\u052d\3\2\2\2\u052d"+ - "\u052e\b\u0099\3\2\u052e\u0133\3\2\2\2\u052f\u0531\t\f\2\2\u0530\u052f"+ - "\3\2\2\2\u0531\u0532\3\2\2\2\u0532\u0530\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+ - "\u0534\3\2\2\2\u0534\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0537"+ - "\7\61\2\2\u0537\u0538\7\61\2\2\u0538\u053c\3\2\2\2\u0539\u053b\n\f\2\2"+ - "\u053a\u0539\3\2\2\2\u053b\u053e\3\2\2\2\u053c\u053a\3\2\2\2\u053c\u053d"+ - "\3\2\2\2\u053d\u053f\3\2\2\2\u053e\u053c\3\2\2\2\u053f\u0540\b\u009b\3"+ - "\2\u0540\u0137\3\2\2\2\u0541\u0546\n\r\2\2\u0542\u0546\5\u0128\u0094\2"+ - "\u0543\u0546\5\u012a\u0095\2\u0544\u0546\5\u013a\u009d\2\u0545\u0541\3"+ - "\2\2\2\u0545\u0542\3\2\2\2\u0545\u0543\3\2\2\2\u0545\u0544\3\2\2\2\u0546"+ - "\u0139\3\2\2\2\u0547\u0561\7^\2\2\u0548\u0549\7w\2\2\u0549\u054a\5\u0140"+ - "\u00a0\2\u054a\u054b\5\u0140\u00a0\2\u054b\u054c\5\u0140\u00a0\2\u054c"+ - "\u054d\5\u0140\u00a0\2\u054d\u0562\3\2\2\2\u054e\u054f\7W\2\2\u054f\u0550"+ - "\5\u0140\u00a0\2\u0550\u0551\5\u0140\u00a0\2\u0551\u0552\5\u0140\u00a0"+ - "\2\u0552\u0553\5\u0140\u00a0\2\u0553\u0554\5\u0140\u00a0\2\u0554\u0555"+ - "\5\u0140\u00a0\2\u0555\u0556\5\u0140\u00a0\2\u0556\u0557\5\u0140\u00a0"+ - "\2\u0557\u0562\3\2\2\2\u0558\u0562\t\16\2\2\u0559\u055a\5\u013e\u009f"+ - "\2\u055a\u055b\5\u013e\u009f\2\u055b\u055c\5\u013e\u009f\2\u055c\u0562"+ - "\3\2\2\2\u055d\u055e\7z\2\2\u055e\u055f\5\u0140\u00a0\2\u055f\u0560\5"+ - "\u0140\u00a0\2\u0560\u0562\3\2\2\2\u0561\u0548\3\2\2\2\u0561\u054e\3\2"+ - "\2\2\u0561\u0558\3\2\2\2\u0561\u0559\3\2\2\2\u0561\u055d\3\2\2\2\u0562"+ - "\u013b\3\2\2\2\u0563\u056a\t\3\2\2\u0564\u0566\7a\2\2\u0565\u0564\3\2"+ - "\2\2\u0565\u0566\3\2\2\2\u0566\u0567\3\2\2\2\u0567\u0569\t\3\2\2\u0568"+ - "\u0565\3\2\2\2\u0569\u056c\3\2\2\2\u056a\u0568\3\2\2\2\u056a\u056b\3\2"+ - "\2\2\u056b\u013d\3\2\2\2\u056c\u056a\3\2\2\2\u056d\u056e\t\17\2\2\u056e"+ - "\u013f\3\2\2\2\u056f\u0570\t\20\2\2\u0570\u0141\3\2\2\2\u0571\u0572\t"+ - "\21\2\2\u0572\u0143\3\2\2\2\u0573\u0575\t\22\2\2\u0574\u0576\t\b\2\2\u0575"+ - "\u0574\3\2\2\2\u0575\u0576\3\2\2\2\u0576\u0577\3\2\2\2\u0577\u0578\5\u013c"+ - "\u009e\2\u0578\u0145\3\2\2\2\u0579\u057c\5\u014a\u00a5\2\u057a\u057c\7"+ - "a\2\2\u057b\u0579\3\2\2\2\u057b\u057a\3\2\2\2\u057c\u0147\3\2\2\2\u057d"+ - "\u057e\t\23\2\2\u057e\u0149\3\2\2\2\u057f\u0580\t\24\2\2\u0580\u014b\3"+ - "\2\2\2\u0581\u0583\t\13\2\2\u0582\u0581\3\2\2\2\u0583\u0584\3\2\2\2\u0584"+ - "\u0582\3\2\2\2\u0584\u0585\3\2\2\2\u0585\u0586\3\2\2\2\u0586\u0587\b\u00a6"+ - "\3\2\u0587\u014d\3\2\2\2\u0588\u0589\7\61\2\2\u0589\u058a\7,\2\2\u058a"+ - "\u058e\3\2\2\2\u058b\u058d\n\f\2\2\u058c\u058b\3\2\2\2\u058d\u0590\3\2"+ - "\2\2\u058e\u058f\3\2\2\2\u058e\u058c\3\2\2\2\u058f\u0591\3\2\2\2\u0590"+ - "\u058e\3\2\2\2\u0591\u0592\7,\2\2\u0592\u0593\7\61\2\2\u0593\u0594\3\2"+ - "\2\2\u0594\u0595\b\u00a7\3\2\u0595\u014f\3\2\2\2\u0596\u0597\7\61\2\2"+ - "\u0597\u0598\7\61\2\2\u0598\u059c\3\2\2\2\u0599\u059b\n\f\2\2\u059a\u0599"+ - "\3\2\2\2\u059b\u059e\3\2\2\2\u059c\u059a\3\2\2\2\u059c\u059d\3\2\2\2\u059d"+ - "\u059f\3\2\2\2\u059e\u059c\3\2\2\2\u059f\u05a0\b\u00a8\3\2\u05a0\u0151"+ - "\3\2\2\2\u05a1\u05a3\t\f\2\2\u05a2\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+ - "\u05a2\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05b4\3\2\2\2\u05a6\u05b4\7="+ - "\2\2\u05a7\u05a8\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9\u05ad\3\2\2\2\u05aa"+ - "\u05ac\13\2\2\2\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2\2\2\u05ad\u05ae\3"+ - "\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af\u05ad\3\2\2\2\u05b0"+ - "\u05b1\7,\2\2\u05b1\u05b4\7\61\2\2\u05b2\u05b4\7\2\2\3\u05b3\u05a2\3\2"+ - "\2\2\u05b3\u05a6\3\2\2\2\u05b3\u05a7\3\2\2\2\u05b3\u05b2\3\2\2\2\u05b4"+ - "\u05b5\3\2\2\2\u05b5\u05b6\b\u00a9\4\2\u05b6\u0153\3\2\2\2\u05b7\u05b8"+ - "\3\2\2\2\u05b8\u05b9\3\2\2\2\u05b9\u05ba\b\u00aa\4\2\u05ba\u05bb\b\u00aa"+ - "\3\2\u05bb\u0155\3\2\2\2\64\2\3\u0158\u0160\u0163\u0166\u016c\u016e\u0406"+ - "\u0408\u0471\u0476\u0479\u0480\u0485\u048b\u048e\u0493\u049a\u049f\u04a9"+ - "\u04ae\u04b2\u04b7\u04ba\u04bf\u04c4\u04c7\u04d2\u04db\u04e5\u0507\u0511"+ - "\u0513\u051d\u0527\u0532\u053c\u0545\u0561\u0565\u056a\u0575\u057b\u0584"+ - "\u058e\u059c\u05a4\u05ad\u05b3\5\4\3\2\2\3\2\4\2\2"; + "\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\3\2\3\2\5\2\u015b\n\2"+ + "\3\2\3\2\3\3\3\3\3\3\3\3\5\3\u0163\n\3\3\3\5\3\u0166\n\3\3\3\5\3\u0169"+ + "\n\3\3\3\3\3\3\3\3\3\5\3\u016f\n\3\5\3\u0171\n\3\3\4\3\4\3\4\3\4\3\4\3"+ + "\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\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\t\3\t\3\t\3\t\3"+ + "\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13"+ + "\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\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\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ + "\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3"+ + "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\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\23\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\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\30\3\30\3\30\3\30\3\30\3"+ + "\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+ + "\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3"+ + "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\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\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61"+ + "\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\63\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\64\3\64\3\65"+ + "\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+ + "\3\67\3\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38"+ + "\38\38\39\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?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A"+ + "\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C"+ + "\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F"+ + "\3F\3F\3F\3G\3G\3G\3G\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J"+ + "\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M"+ + "\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\3Q\3R"+ + "\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3V\3V"+ + "\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y"+ + "\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\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_\3_\3"+ + "_\3_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3"+ + "c\7c\u040e\nc\fc\16c\u0411\13c\3c\3c\3d\3d\3e\3e\3e\3e\3f\3f\3g\3g\3g"+ + "\3g\3h\3h\3i\3i\3i\3i\3j\3j\3k\3k\3l\3l\3m\3m\3n\3n\3o\3o\3o\3o\3o\3p"+ + "\3p\3p\3p\3p\3q\3q\3q\3r\3r\3r\3r\3s\3s\3s\3t\3t\3t\3u\3u\3u\3v\3v\3v"+ + "\3w\3w\3x\3x\3x\3y\3y\3z\3z\3z\3{\3{\3|\3|\3}\3}\3~\3~\3~\3\177\3\177"+ + "\3\177\3\u0080\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083"+ + "\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0087\3\u0087"+ + "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u0479\n\u0088\3\u0088\7\u0088"+ + "\u047c\n\u0088\f\u0088\16\u0088\u047f\13\u0088\5\u0088\u0481\n\u0088\3"+ + "\u0088\3\u0088\3\u0089\3\u0089\3\u0089\5\u0089\u0488\n\u0089\3\u0089\6"+ + "\u0089\u048b\n\u0089\r\u0089\16\u0089\u048c\3\u0089\3\u0089\3\u008a\3"+ + "\u008a\5\u008a\u0493\n\u008a\3\u008a\5\u008a\u0496\n\u008a\3\u008a\6\u008a"+ + "\u0499\n\u008a\r\u008a\16\u008a\u049a\3\u008a\3\u008a\3\u008b\3\u008b"+ + "\3\u008b\5\u008b\u04a2\n\u008b\3\u008b\6\u008b\u04a5\n\u008b\r\u008b\16"+ + "\u008b\u04a6\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3\u008c\3"+ + "\u008d\5\u008d\u04b1\n\u008d\3\u008d\6\u008d\u04b4\n\u008d\r\u008d\16"+ + "\u008d\u04b5\3\u008d\3\u008d\5\u008d\u04ba\n\u008d\3\u008d\7\u008d\u04bd"+ + "\n\u008d\f\u008d\16\u008d\u04c0\13\u008d\5\u008d\u04c2\n\u008d\3\u008d"+ + "\3\u008d\3\u008d\5\u008d\u04c7\n\u008d\3\u008d\7\u008d\u04ca\n\u008d\f"+ + "\u008d\16\u008d\u04cd\13\u008d\5\u008d\u04cf\n\u008d\3\u008e\3\u008e\3"+ + "\u008e\3\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f\5\u008f\u04da\n"+ + "\u008f\3\u008f\3\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\5\u0090"+ + "\u04e3\n\u0090\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091\3\u0092"+ + "\3\u0092\5\u0092\u04ed\n\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0093"+ + "\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095"+ + "\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096"+ + "\3\u0096\3\u0096\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\7\u0097\u050d"+ + "\n\u0097\f\u0097\16\u0097\u0510\13\u0097\3\u0097\3\u0097\3\u0097\3\u0097"+ + "\3\u0098\3\u0098\3\u0098\7\u0098\u0519\n\u0098\f\u0098\16\u0098\u051c"+ + "\13\u0098\3\u0098\3\u0098\3\u0098\3\u0098\3\u0099\6\u0099\u0523\n\u0099"+ + "\r\u0099\16\u0099\u0524\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a"+ + "\7\u009a\u052d\n\u009a\f\u009a\16\u009a\u0530\13\u009a\3\u009a\3\u009a"+ + "\3\u009a\3\u009a\3\u009a\3\u009b\6\u009b\u0538\n\u009b\r\u009b\16\u009b"+ + "\u0539\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009c\7\u009c\u0542\n"+ + "\u009c\f\u009c\16\u009c\u0545\13\u009c\3\u009c\3\u009c\3\u009d\3\u009d"+ + "\3\u009d\3\u009d\5\u009d\u054d\n\u009d\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e\3\u009e"+ + "\3\u009e\3\u009e\3\u009e\3\u009e\5\u009e\u0569\n\u009e\3\u009f\3\u009f"+ + "\5\u009f\u056d\n\u009f\3\u009f\7\u009f\u0570\n\u009f\f\u009f\16\u009f"+ + "\u0573\13\u009f\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a3"+ + "\3\u00a3\5\u00a3\u057d\n\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\5\u00a4"+ + "\u0583\n\u00a4\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a7\6\u00a7\u058a\n"+ + "\u00a7\r\u00a7\16\u00a7\u058b\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8"+ + "\3\u00a8\7\u00a8\u0594\n\u00a8\f\u00a8\16\u00a8\u0597\13\u00a8\3\u00a8"+ + "\3\u00a8\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9\3\u00a9\7\u00a9"+ + "\u05a2\n\u00a9\f\u00a9\16\u00a9\u05a5\13\u00a9\3\u00a9\3\u00a9\3\u00aa"+ + "\6\u00aa\u05aa\n\u00aa\r\u00aa\16\u00aa\u05ab\3\u00aa\3\u00aa\3\u00aa"+ + "\3\u00aa\3\u00aa\7\u00aa\u05b3\n\u00aa\f\u00aa\16\u00aa\u05b6\13\u00aa"+ + "\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u05bb\n\u00aa\3\u00aa\3\u00aa\3\u00ab"+ + "\3\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u052e\u0595\u05b4\2\u00ac\4\3\6\4\b"+ + "\5\n\6\f\7\16\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$"+ + "\23&\24(\25*\26,\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F"+ + "$H%J&L\'N(P)R*T+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v|?~@\u0080A\u0082B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I"+ + "\u0092J\u0094K\u0096L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\u00a4"+ + "S\u00a6T\u00a8U\u00aaV\u00acW\u00aeX\u00b0Y\u00b2Z\u00b4[\u00b6\\\u00b8"+ + "]\u00ba^\u00bc_\u00be`\u00c0a\u00c2b\u00c4c\u00c6d\u00c8e\u00caf\u00cc"+ + "g\u00ceh\u00d0i\u00d2j\u00d4k\u00d6l\u00d8m\u00dan\u00dco\u00dep\u00e0"+ + "q\u00e2r\u00e4s\u00e6t\u00e8u\u00eav\u00ecw\u00eex\u00f0y\u00f2z\u00f4"+ + "{\u00f6|\u00f8}\u00fa~\u00fc\177\u00fe\u0080\u0100\u0081\u0102\u0082\u0104"+ + "\u0083\u0106\u0084\u0108\u0085\u010a\u0086\u010c\u0087\u010e\u0088\u0110"+ + "\u0089\u0112\u008a\u0114\u008b\u0116\u008c\u0118\u008d\u011a\2\u011c\2"+ + "\u011e\u008e\u0120\2\u0122\u008f\u0124\u0090\u0126\u0091\u0128\u0092\u012a"+ + "\u0093\u012c\u0094\u012e\u0095\u0130\u0096\u0132\u0097\u0134\u0098\u0136"+ + "\u0099\u0138\u009a\u013a\2\u013c\2\u013e\2\u0140\2\u0142\2\u0144\2\u0146"+ + "\2\u0148\2\u014a\2\u014c\2\u014e\u009b\u0150\u009c\u0152\u009d\u0154\u009e"+ + "\u0156\u009f\4\2\3\23\3\2\63;\3\2\62;\4\2DDdd\4\2QQqq\4\2ZZzz\4\2RRrr"+ + "\4\2--//\3\2bb\4\2$$^^\4\2\13\13\"\"\4\2\f\f\17\17\5\2\f\f\17\17))\13"+ + "\2$$))^^cdhhppttvvxx\3\2\629\5\2\62;CHch\3\2\62\63\4\2GGgg\49\2\62\2;"+ + "\2\u0662\2\u066b\2\u06f2\2\u06fb\2\u07c2\2\u07cb\2\u0968\2\u0971\2\u09e8"+ + "\2\u09f1\2\u0a68\2\u0a71\2\u0ae8\2\u0af1\2\u0b68\2\u0b71\2\u0be8\2\u0bf1"+ + "\2\u0c68\2\u0c71\2\u0ce8\2\u0cf1\2\u0d68\2\u0d71\2\u0de8\2\u0df1\2\u0e52"+ + "\2\u0e5b\2\u0ed2\2\u0edb\2\u0f22\2\u0f2b\2\u1042\2\u104b\2\u1092\2\u109b"+ + "\2\u17e2\2\u17eb\2\u1812\2\u181b\2\u1948\2\u1951\2\u19d2\2\u19db\2\u1a82"+ + "\2\u1a8b\2\u1a92\2\u1a9b\2\u1b52\2\u1b5b\2\u1bb2\2\u1bbb\2\u1c42\2\u1c4b"+ + "\2\u1c52\2\u1c5b\2\ua622\2\ua62b\2\ua8d2\2\ua8db\2\ua902\2\ua90b\2\ua9d2"+ + "\2\ua9db\2\ua9f2\2\ua9fb\2\uaa52\2\uaa5b\2\uabf2\2\uabfb\2\uff12\2\uff1b"+ + "\2\u04a2\3\u04ab\3\u1068\3\u1071\3\u10f2\3\u10fb\3\u1138\3\u1141\3\u11d2"+ + "\3\u11db\3\u12f2\3\u12fb\3\u1452\3\u145b\3\u14d2\3\u14db\3\u1652\3\u165b"+ + "\3\u16c2\3\u16cb\3\u1732\3\u173b\3\u18e2\3\u18eb\3\u1c52\3\u1c5b\3\u1d52"+ + "\3\u1d5b\3\u6a62\3\u6a6b\3\u6b52\3\u6b5b\3\ud7d0\3\ud801\3\ue952\3\ue95b"+ + "\3\u024b\2C\2\\\2c\2|\2\u00ac\2\u00ac\2\u00b7\2\u00b7\2\u00bc\2\u00bc"+ + "\2\u00c2\2\u00d8\2\u00da\2\u00f8\2\u00fa\2\u02c3\2\u02c8\2\u02d3\2\u02e2"+ + "\2\u02e6\2\u02ee\2\u02ee\2\u02f0\2\u02f0\2\u0372\2\u0376\2\u0378\2\u0379"+ + "\2\u037c\2\u037f\2\u0381\2\u0381\2\u0388\2\u0388\2\u038a\2\u038c\2\u038e"+ + "\2\u038e\2\u0390\2\u03a3\2\u03a5\2\u03f7\2\u03f9\2\u0483\2\u048c\2\u0531"+ + "\2\u0533\2\u0558\2\u055b\2\u055b\2\u0563\2\u0589\2\u05d2\2\u05ec\2\u05f2"+ + "\2\u05f4\2\u0622\2\u064c\2\u0670\2\u0671\2\u0673\2\u06d5\2\u06d7\2\u06d7"+ + "\2\u06e7\2\u06e8\2\u06f0\2\u06f1\2\u06fc\2\u06fe\2\u0701\2\u0701\2\u0712"+ + "\2\u0712\2\u0714\2\u0731\2\u074f\2\u07a7\2\u07b3\2\u07b3\2\u07cc\2\u07ec"+ + "\2\u07f6\2\u07f7\2\u07fc\2\u07fc\2\u0802\2\u0817\2\u081c\2\u081c\2\u0826"+ + "\2\u0826\2\u082a\2\u082a\2\u0842\2\u085a\2\u0862\2\u086c\2\u08a2\2\u08b6"+ + "\2\u08b8\2\u08bf\2\u0906\2\u093b\2\u093f\2\u093f\2\u0952\2\u0952\2\u095a"+ + "\2\u0963\2\u0973\2\u0982\2\u0987\2\u098e\2\u0991\2\u0992\2\u0995\2\u09aa"+ + "\2\u09ac\2\u09b2\2\u09b4\2\u09b4\2\u09b8\2\u09bb\2\u09bf\2\u09bf\2\u09d0"+ + "\2\u09d0\2\u09de\2\u09df\2\u09e1\2\u09e3\2\u09f2\2\u09f3\2\u09fe\2\u09fe"+ + "\2\u0a07\2\u0a0c\2\u0a11\2\u0a12\2\u0a15\2\u0a2a\2\u0a2c\2\u0a32\2\u0a34"+ + "\2\u0a35\2\u0a37\2\u0a38\2\u0a3a\2\u0a3b\2\u0a5b\2\u0a5e\2\u0a60\2\u0a60"+ + "\2\u0a74\2\u0a76\2\u0a87\2\u0a8f\2\u0a91\2\u0a93\2\u0a95\2\u0aaa\2\u0aac"+ + "\2\u0ab2\2\u0ab4\2\u0ab5\2\u0ab7\2\u0abb\2\u0abf\2\u0abf\2\u0ad2\2\u0ad2"+ + "\2\u0ae2\2\u0ae3\2\u0afb\2\u0afb\2\u0b07\2\u0b0e\2\u0b11\2\u0b12\2\u0b15"+ + "\2\u0b2a\2\u0b2c\2\u0b32\2\u0b34\2\u0b35\2\u0b37\2\u0b3b\2\u0b3f\2\u0b3f"+ + "\2\u0b5e\2\u0b5f\2\u0b61\2\u0b63\2\u0b73\2\u0b73\2\u0b85\2\u0b85\2\u0b87"+ + "\2\u0b8c\2\u0b90\2\u0b92\2\u0b94\2\u0b97\2\u0b9b\2\u0b9c\2\u0b9e\2\u0b9e"+ + "\2\u0ba0\2\u0ba1\2\u0ba5\2\u0ba6\2\u0baa\2\u0bac\2\u0bb0\2\u0bbb\2\u0bd2"+ + "\2\u0bd2\2\u0c07\2\u0c0e\2\u0c10\2\u0c12\2\u0c14\2\u0c2a\2\u0c2c\2\u0c3b"+ + "\2\u0c3f\2\u0c3f\2\u0c5a\2\u0c5c\2\u0c62\2\u0c63\2\u0c82\2\u0c82\2\u0c87"+ + "\2\u0c8e\2\u0c90\2\u0c92\2\u0c94\2\u0caa\2\u0cac\2\u0cb5\2\u0cb7\2\u0cbb"+ + "\2\u0cbf\2\u0cbf\2\u0ce0\2\u0ce0\2\u0ce2\2\u0ce3\2\u0cf3\2\u0cf4\2\u0d07"+ + "\2\u0d0e\2\u0d10\2\u0d12\2\u0d14\2\u0d3c\2\u0d3f\2\u0d3f\2\u0d50\2\u0d50"+ + "\2\u0d56\2\u0d58\2\u0d61\2\u0d63\2\u0d7c\2\u0d81\2\u0d87\2\u0d98\2\u0d9c"+ + "\2\u0db3\2\u0db5\2\u0dbd\2\u0dbf\2\u0dbf\2\u0dc2\2\u0dc8\2\u0e03\2\u0e32"+ + "\2\u0e34\2\u0e35\2\u0e42\2\u0e48\2\u0e83\2\u0e84\2\u0e86\2\u0e86\2\u0e89"+ + "\2\u0e8a\2\u0e8c\2\u0e8c\2\u0e8f\2\u0e8f\2\u0e96\2\u0e99\2\u0e9b\2\u0ea1"+ + "\2\u0ea3\2\u0ea5\2\u0ea7\2\u0ea7\2\u0ea9\2\u0ea9\2\u0eac\2\u0ead\2\u0eaf"+ + "\2\u0eb2\2\u0eb4\2\u0eb5\2\u0ebf\2\u0ebf\2\u0ec2\2\u0ec6\2\u0ec8\2\u0ec8"+ + "\2\u0ede\2\u0ee1\2\u0f02\2\u0f02\2\u0f42\2\u0f49\2\u0f4b\2\u0f6e\2\u0f8a"+ + "\2\u0f8e\2\u1002\2\u102c\2\u1041\2\u1041\2\u1052\2\u1057\2\u105c\2\u105f"+ + "\2\u1063\2\u1063\2\u1067\2\u1068\2\u1070\2\u1072\2\u1077\2\u1083\2\u1090"+ + "\2\u1090\2\u10a2\2\u10c7\2\u10c9\2\u10c9\2\u10cf\2\u10cf\2\u10d2\2\u10fc"+ + "\2\u10fe\2\u124a\2\u124c\2\u124f\2\u1252\2\u1258\2\u125a\2\u125a\2\u125c"+ + "\2\u125f\2\u1262\2\u128a\2\u128c\2\u128f\2\u1292\2\u12b2\2\u12b4\2\u12b7"+ + "\2\u12ba\2\u12c0\2\u12c2\2\u12c2\2\u12c4\2\u12c7\2\u12ca\2\u12d8\2\u12da"+ + "\2\u1312\2\u1314\2\u1317\2\u131a\2\u135c\2\u1382\2\u1391\2\u13a2\2\u13f7"+ + "\2\u13fa\2\u13ff\2\u1403\2\u166e\2\u1671\2\u1681\2\u1683\2\u169c\2\u16a2"+ + "\2\u16ec\2\u16f3\2\u16fa\2\u1702\2\u170e\2\u1710\2\u1713\2\u1722\2\u1733"+ + "\2\u1742\2\u1753\2\u1762\2\u176e\2\u1770\2\u1772\2\u1782\2\u17b5\2\u17d9"+ + "\2\u17d9\2\u17de\2\u17de\2\u1822\2\u1879\2\u1882\2\u1886\2\u1889\2\u18aa"+ + "\2\u18ac\2\u18ac\2\u18b2\2\u18f7\2\u1902\2\u1920\2\u1952\2\u196f\2\u1972"+ + "\2\u1976\2\u1982\2\u19ad\2\u19b2\2\u19cb\2\u1a02\2\u1a18\2\u1a22\2\u1a56"+ + "\2\u1aa9\2\u1aa9\2\u1b07\2\u1b35\2\u1b47\2\u1b4d\2\u1b85\2\u1ba2\2\u1bb0"+ + "\2\u1bb1\2\u1bbc\2\u1be7\2\u1c02\2\u1c25\2\u1c4f\2\u1c51\2\u1c5c\2\u1c7f"+ + "\2\u1c82\2\u1c8a\2\u1ceb\2\u1cee\2\u1cf0\2\u1cf3\2\u1cf7\2\u1cf8\2\u1d02"+ + "\2\u1dc1\2\u1e02\2\u1f17\2\u1f1a\2\u1f1f\2\u1f22\2\u1f47\2\u1f4a\2\u1f4f"+ + "\2\u1f52\2\u1f59\2\u1f5b\2\u1f5b\2\u1f5d\2\u1f5d\2\u1f5f\2\u1f5f\2\u1f61"+ + "\2\u1f7f\2\u1f82\2\u1fb6\2\u1fb8\2\u1fbe\2\u1fc0\2\u1fc0\2\u1fc4\2\u1fc6"+ + "\2\u1fc8\2\u1fce\2\u1fd2\2\u1fd5\2\u1fd8\2\u1fdd\2\u1fe2\2\u1fee\2\u1ff4"+ + "\2\u1ff6\2\u1ff8\2\u1ffe\2\u2073\2\u2073\2\u2081\2\u2081\2\u2092\2\u209e"+ + "\2\u2104\2\u2104\2\u2109\2\u2109\2\u210c\2\u2115\2\u2117\2\u2117\2\u211b"+ + "\2\u211f\2\u2126\2\u2126\2\u2128\2\u2128\2\u212a\2\u212a\2\u212c\2\u212f"+ + "\2\u2131\2\u213b\2\u213e\2\u2141\2\u2147\2\u214b\2\u2150\2\u2150\2\u2185"+ + "\2\u2186\2\u2c02\2\u2c30\2\u2c32\2\u2c60\2\u2c62\2\u2ce6\2\u2ced\2\u2cf0"+ + "\2\u2cf4\2\u2cf5\2\u2d02\2\u2d27\2\u2d29\2\u2d29\2\u2d2f\2\u2d2f\2\u2d32"+ + "\2\u2d69\2\u2d71\2\u2d71\2\u2d82\2\u2d98\2\u2da2\2\u2da8\2\u2daa\2\u2db0"+ + "\2\u2db2\2\u2db8\2\u2dba\2\u2dc0\2\u2dc2\2\u2dc8\2\u2dca\2\u2dd0\2\u2dd2"+ + "\2\u2dd8\2\u2dda\2\u2de0\2\u2e31\2\u2e31\2\u3007\2\u3008\2\u3033\2\u3037"+ + "\2\u303d\2\u303e\2\u3043\2\u3098\2\u309f\2\u30a1\2\u30a3\2\u30fc\2\u30fe"+ + "\2\u3101\2\u3107\2\u3130\2\u3133\2\u3190\2\u31a2\2\u31bc\2\u31f2\2\u3201"+ + "\2\u3402\2\u4db7\2\u4e02\2\u9fec\2\ua002\2\ua48e\2\ua4d2\2\ua4ff\2\ua502"+ + "\2\ua60e\2\ua612\2\ua621\2\ua62c\2\ua62d\2\ua642\2\ua670\2\ua681\2\ua69f"+ + "\2\ua6a2\2\ua6e7\2\ua719\2\ua721\2\ua724\2\ua78a\2\ua78d\2\ua7b0\2\ua7b2"+ + "\2\ua7b9\2\ua7f9\2\ua803\2\ua805\2\ua807\2\ua809\2\ua80c\2\ua80e\2\ua824"+ + "\2\ua842\2\ua875\2\ua884\2\ua8b5\2\ua8f4\2\ua8f9\2\ua8fd\2\ua8fd\2\ua8ff"+ + "\2\ua8ff\2\ua90c\2\ua927\2\ua932\2\ua948\2\ua962\2\ua97e\2\ua986\2\ua9b4"+ + "\2\ua9d1\2\ua9d1\2\ua9e2\2\ua9e6\2\ua9e8\2\ua9f1\2\ua9fc\2\uaa00\2\uaa02"+ + "\2\uaa2a\2\uaa42\2\uaa44\2\uaa46\2\uaa4d\2\uaa62\2\uaa78\2\uaa7c\2\uaa7c"+ + "\2\uaa80\2\uaab1\2\uaab3\2\uaab3\2\uaab7\2\uaab8\2\uaabb\2\uaabf\2\uaac2"+ + "\2\uaac2\2\uaac4\2\uaac4\2\uaadd\2\uaadf\2\uaae2\2\uaaec\2\uaaf4\2\uaaf6"+ + "\2\uab03\2\uab08\2\uab0b\2\uab10\2\uab13\2\uab18\2\uab22\2\uab28\2\uab2a"+ + "\2\uab30\2\uab32\2\uab5c\2\uab5e\2\uab67\2\uab72\2\uabe4\2\uac02\2\ud7a5"+ + "\2\ud7b2\2\ud7c8\2\ud7cd\2\ud7fd\2\uf902\2\ufa6f\2\ufa72\2\ufadb\2\ufb02"+ + "\2\ufb08\2\ufb15\2\ufb19\2\ufb1f\2\ufb1f\2\ufb21\2\ufb2a\2\ufb2c\2\ufb38"+ + "\2\ufb3a\2\ufb3e\2\ufb40\2\ufb40\2\ufb42\2\ufb43\2\ufb45\2\ufb46\2\ufb48"+ + "\2\ufbb3\2\ufbd5\2\ufd3f\2\ufd52\2\ufd91\2\ufd94\2\ufdc9\2\ufdf2\2\ufdfd"+ + "\2\ufe72\2\ufe76\2\ufe78\2\ufefe\2\uff23\2\uff3c\2\uff43\2\uff5c\2\uff68"+ + "\2\uffc0\2\uffc4\2\uffc9\2\uffcc\2\uffd1\2\uffd4\2\uffd9\2\uffdc\2\uffde"+ + "\2\2\3\r\3\17\3(\3*\3<\3>\3?\3A\3O\3R\3_\3\u0082\3\u00fc\3\u0282\3\u029e"+ + "\3\u02a2\3\u02d2\3\u0302\3\u0321\3\u032f\3\u0342\3\u0344\3\u034b\3\u0352"+ + "\3\u0377\3\u0382\3\u039f\3\u03a2\3\u03c5\3\u03ca\3\u03d1\3\u0402\3\u049f"+ + "\3\u04b2\3\u04d5\3\u04da\3\u04fd\3\u0502\3\u0529\3\u0532\3\u0565\3\u0602"+ + "\3\u0738\3\u0742\3\u0757\3\u0762\3\u0769\3\u0802\3\u0807\3\u080a\3\u080a"+ + "\3\u080c\3\u0837\3\u0839\3\u083a\3\u083e\3\u083e\3\u0841\3\u0857\3\u0862"+ + "\3\u0878\3\u0882\3\u08a0\3\u08e2\3\u08f4\3\u08f6\3\u08f7\3\u0902\3\u0917"+ + "\3\u0922\3\u093b\3\u0982\3\u09b9\3\u09c0\3\u09c1\3\u0a02\3\u0a02\3\u0a12"+ + "\3\u0a15\3\u0a17\3\u0a19\3\u0a1b\3\u0a35\3\u0a62\3\u0a7e\3\u0a82\3\u0a9e"+ + "\3\u0ac2\3\u0ac9\3\u0acb\3\u0ae6\3\u0b02\3\u0b37\3\u0b42\3\u0b57\3\u0b62"+ + "\3\u0b74\3\u0b82\3\u0b93\3\u0c02\3\u0c4a\3\u0c82\3\u0cb4\3\u0cc2\3\u0cf4"+ + "\3\u1005\3\u1039\3\u1085\3\u10b1\3\u10d2\3\u10ea\3\u1105\3\u1128\3\u1152"+ + "\3\u1174\3\u1178\3\u1178\3\u1185\3\u11b4\3\u11c3\3\u11c6\3\u11dc\3\u11dc"+ + "\3\u11de\3\u11de\3\u1202\3\u1213\3\u1215\3\u122d\3\u1282\3\u1288\3\u128a"+ + "\3\u128a\3\u128c\3\u128f\3\u1291\3\u129f\3\u12a1\3\u12aa\3\u12b2\3\u12e0"+ + "\3\u1307\3\u130e\3\u1311\3\u1312\3\u1315\3\u132a\3\u132c\3\u1332\3\u1334"+ + "\3\u1335\3\u1337\3\u133b\3\u133f\3\u133f\3\u1352\3\u1352\3\u135f\3\u1363"+ + "\3\u1402\3\u1436\3\u1449\3\u144c\3\u1482\3\u14b1\3\u14c6\3\u14c7\3\u14c9"+ + "\3\u14c9\3\u1582\3\u15b0\3\u15da\3\u15dd\3\u1602\3\u1631\3\u1646\3\u1646"+ + "\3\u1682\3\u16ac\3\u1702\3\u171b\3\u18a2\3\u18e1\3\u1901\3\u1901\3\u1a02"+ + "\3\u1a02\3\u1a0d\3\u1a34\3\u1a3c\3\u1a3c\3\u1a52\3\u1a52\3\u1a5e\3\u1a85"+ + "\3\u1a88\3\u1a8b\3\u1ac2\3\u1afa\3\u1c02\3\u1c0a\3\u1c0c\3\u1c30\3\u1c42"+ + "\3\u1c42\3\u1c74\3\u1c91\3\u1d02\3\u1d08\3\u1d0a\3\u1d0b\3\u1d0d\3\u1d32"+ + "\3\u1d48\3\u1d48\3\u2002\3\u239b\3\u2482\3\u2545\3\u3002\3\u3430\3\u4402"+ + "\3\u4648\3\u6802\3\u6a3a\3\u6a42\3\u6a60\3\u6ad2\3\u6aef\3\u6b02\3\u6b31"+ + "\3\u6b42\3\u6b45\3\u6b65\3\u6b79\3\u6b7f\3\u6b91\3\u6f02\3\u6f46\3\u6f52"+ + "\3\u6f52\3\u6f95\3\u6fa1\3\u6fe2\3\u6fe3\3\u7002\3\u87ee\3\u8802\3\u8af4"+ + "\3\ub002\3\ub120\3\ub172\3\ub2fd\3\ubc02\3\ubc6c\3\ubc72\3\ubc7e\3\ubc82"+ + "\3\ubc8a\3\ubc92\3\ubc9b\3\ud402\3\ud456\3\ud458\3\ud49e\3\ud4a0\3\ud4a1"+ + "\3\ud4a4\3\ud4a4\3\ud4a7\3\ud4a8\3\ud4ab\3\ud4ae\3\ud4b0\3\ud4bb\3\ud4bd"+ + "\3\ud4bd\3\ud4bf\3\ud4c5\3\ud4c7\3\ud507\3\ud509\3\ud50c\3\ud50f\3\ud516"+ + "\3\ud518\3\ud51e\3\ud520\3\ud53b\3\ud53d\3\ud540\3\ud542\3\ud546\3\ud548"+ + "\3\ud548\3\ud54c\3\ud552\3\ud554\3\ud6a7\3\ud6aa\3\ud6c2\3\ud6c4\3\ud6dc"+ + "\3\ud6de\3\ud6fc\3\ud6fe\3\ud716\3\ud718\3\ud736\3\ud738\3\ud750\3\ud752"+ + "\3\ud770\3\ud772\3\ud78a\3\ud78c\3\ud7aa\3\ud7ac\3\ud7c4\3\ud7c6\3\ud7cd"+ + "\3\ue802\3\ue8c6\3\ue902\3\ue945\3\uee02\3\uee05\3\uee07\3\uee21\3\uee23"+ + "\3\uee24\3\uee26\3\uee26\3\uee29\3\uee29\3\uee2b\3\uee34\3\uee36\3\uee39"+ + "\3\uee3b\3\uee3b\3\uee3d\3\uee3d\3\uee44\3\uee44\3\uee49\3\uee49\3\uee4b"+ + "\3\uee4b\3\uee4d\3\uee4d\3\uee4f\3\uee51\3\uee53\3\uee54\3\uee56\3\uee56"+ + "\3\uee59\3\uee59\3\uee5b\3\uee5b\3\uee5d\3\uee5d\3\uee5f\3\uee5f\3\uee61"+ + "\3\uee61\3\uee63\3\uee64\3\uee66\3\uee66\3\uee69\3\uee6c\3\uee6e\3\uee74"+ + "\3\uee76\3\uee79\3\uee7b\3\uee7e\3\uee80\3\uee80\3\uee82\3\uee8b\3\uee8d"+ + "\3\uee9d\3\ueea3\3\ueea5\3\ueea7\3\ueeab\3\ueead\3\ueebd\3\2\4\ua6d8\4"+ + "\ua702\4\ub736\4\ub742\4\ub81f\4\ub822\4\ucea3\4\uceb2\4\uebe2\4\uf802"+ + "\4\ufa1f\4\u05ee\2\4\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3"+ + "\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2"+ + "\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2\36\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\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2"+ + ":\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3"+ + "\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2"+ + "\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2"+ + "\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l"+ + "\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2"+ + "\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080\3\2\2\2\2\u0082\3\2\2\2"+ + "\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2\2\2\u008a\3\2\2\2\2\u008c"+ + "\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092\3\2\2\2\2\u0094\3\2\2"+ + "\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2\2\2\u009c\3\2\2\2\2\u009e"+ + "\3\2\2\2\2\u00a0\3\2\2\2\2\u00a2\3\2\2\2\2\u00a4\3\2\2\2\2\u00a6\3\2\2"+ + "\2\2\u00a8\3\2\2\2\2\u00aa\3\2\2\2\2\u00ac\3\2\2\2\2\u00ae\3\2\2\2\2\u00b0"+ + "\3\2\2\2\2\u00b2\3\2\2\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2"+ + "\2\2\u00ba\3\2\2\2\2\u00bc\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2"+ + "\3\2\2\2\2\u00c4\3\2\2\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2"+ + "\2\2\u00cc\3\2\2\2\2\u00ce\3\2\2\2\2\u00d0\3\2\2\2\2\u00d2\3\2\2\2\2\u00d4"+ + "\3\2\2\2\2\u00d6\3\2\2\2\2\u00d8\3\2\2\2\2\u00da\3\2\2\2\2\u00dc\3\2\2"+ + "\2\2\u00de\3\2\2\2\2\u00e0\3\2\2\2\2\u00e2\3\2\2\2\2\u00e4\3\2\2\2\2\u00e6"+ + "\3\2\2\2\2\u00e8\3\2\2\2\2\u00ea\3\2\2\2\2\u00ec\3\2\2\2\2\u00ee\3\2\2"+ + "\2\2\u00f0\3\2\2\2\2\u00f2\3\2\2\2\2\u00f4\3\2\2\2\2\u00f6\3\2\2\2\2\u00f8"+ + "\3\2\2\2\2\u00fa\3\2\2\2\2\u00fc\3\2\2\2\2\u00fe\3\2\2\2\2\u0100\3\2\2"+ + "\2\2\u0102\3\2\2\2\2\u0104\3\2\2\2\2\u0106\3\2\2\2\2\u0108\3\2\2\2\2\u010a"+ + "\3\2\2\2\2\u010c\3\2\2\2\2\u010e\3\2\2\2\2\u0110\3\2\2\2\2\u0112\3\2\2"+ + "\2\2\u0114\3\2\2\2\2\u0116\3\2\2\2\2\u0118\3\2\2\2\2\u011e\3\2\2\2\2\u0122"+ + "\3\2\2\2\2\u0124\3\2\2\2\2\u0126\3\2\2\2\2\u0128\3\2\2\2\2\u012a\3\2\2"+ + "\2\2\u012c\3\2\2\2\2\u012e\3\2\2\2\2\u0130\3\2\2\2\2\u0132\3\2\2\2\2\u0134"+ + "\3\2\2\2\2\u0136\3\2\2\2\2\u0138\3\2\2\2\3\u014e\3\2\2\2\3\u0150\3\2\2"+ + "\2\3\u0152\3\2\2\2\3\u0154\3\2\2\2\3\u0156\3\2\2\2\4\u015a\3\2\2\2\6\u0170"+ + "\3\2\2\2\b\u0172\3\2\2\2\n\u0179\3\2\2\2\f\u0181\3\2\2\2\16\u0188\3\2"+ + "\2\2\20\u018f\3\2\2\2\22\u0196\3\2\2\2\24\u019d\3\2\2\2\26\u01a6\3\2\2"+ + "\2\30\u01b0\3\2\2\2\32\u01b8\3\2\2\2\34\u01c2\3\2\2\2\36\u01ce\3\2\2\2"+ + " \u01d5\3\2\2\2\"\u01e0\3\2\2\2$\u01e3\3\2\2\2&\u01e9\3\2\2\2(\u01f2\3"+ + "\2\2\2*\u01f7\3\2\2\2,\u01fe\3\2\2\2.\u0205\3\2\2\2\60\u020b\3\2\2\2\62"+ + "\u0210\3\2\2\2\64\u0217\3\2\2\2\66\u0221\3\2\2\28\u0227\3\2\2\2:\u022a"+ + "\3\2\2\2<\u022c\3\2\2\2>\u0233\3\2\2\2@\u0239\3\2\2\2B\u0246\3\2\2\2D"+ + "\u024f\3\2\2\2F\u0253\3\2\2\2H\u0257\3\2\2\2J\u025d\3\2\2\2L\u025f\3\2"+ + "\2\2N\u0262\3\2\2\2P\u0267\3\2\2\2R\u026d\3\2\2\2T\u0273\3\2\2\2V\u027a"+ + "\3\2\2\2X\u0281\3\2\2\2Z\u028a\3\2\2\2\\\u0290\3\2\2\2^\u0296\3\2\2\2"+ + "`\u029d\3\2\2\2b\u02a3\3\2\2\2d\u02aa\3\2\2\2f\u02b0\3\2\2\2h\u02b9\3"+ + "\2\2\2j\u02c1\3\2\2\2l\u02c8\3\2\2\2n\u02cd\3\2\2\2p\u02d6\3\2\2\2r\u02e5"+ + "\3\2\2\2t\u02eb\3\2\2\2v\u02ef\3\2\2\2x\u02f2\3\2\2\2z\u02f9\3\2\2\2|"+ + "\u0303\3\2\2\2~\u030d\3\2\2\2\u0080\u0319\3\2\2\2\u0082\u0322\3\2\2\2"+ + "\u0084\u032c\3\2\2\2\u0086\u0334\3\2\2\2\u0088\u0340\3\2\2\2\u008a\u034f"+ + "\3\2\2\2\u008c\u0355\3\2\2\2\u008e\u0359\3\2\2\2\u0090\u035d\3\2\2\2\u0092"+ + "\u0362\3\2\2\2\u0094\u036a\3\2\2\2\u0096\u0372\3\2\2\2\u0098\u0377\3\2"+ + "\2\2\u009a\u0381\3\2\2\2\u009c\u0388\3\2\2\2\u009e\u038d\3\2\2\2\u00a0"+ + "\u0393\3\2\2\2\u00a2\u0396\3\2\2\2\u00a4\u039a\3\2\2\2\u00a6\u03a1\3\2"+ + "\2\2\u00a8\u03a6\3\2\2\2\u00aa\u03ab\3\2\2\2\u00ac\u03b0\3\2\2\2\u00ae"+ + "\u03b8\3\2\2\2\u00b0\u03bf\3\2\2\2\u00b2\u03c5\3\2\2\2\u00b4\u03d3\3\2"+ + "\2\2\u00b6\u03d6\3\2\2\2\u00b8\u03dc\3\2\2\2\u00ba\u03e1\3\2\2\2\u00bc"+ + "\u03ec\3\2\2\2\u00be\u03f0\3\2\2\2\u00c0\u03f7\3\2\2\2\u00c2\u0400\3\2"+ + "\2\2\u00c4\u0404\3\2\2\2\u00c6\u040a\3\2\2\2\u00c8\u0414\3\2\2\2\u00ca"+ + "\u0416\3\2\2\2\u00cc\u041a\3\2\2\2\u00ce\u041c\3\2\2\2\u00d0\u0420\3\2"+ + "\2\2\u00d2\u0422\3\2\2\2\u00d4\u0426\3\2\2\2\u00d6\u0428\3\2\2\2\u00d8"+ + "\u042a\3\2\2\2\u00da\u042c\3\2\2\2\u00dc\u042e\3\2\2\2\u00de\u0430\3\2"+ + "\2\2\u00e0\u0435\3\2\2\2\u00e2\u043a\3\2\2\2\u00e4\u043d\3\2\2\2\u00e6"+ + "\u0441\3\2\2\2\u00e8\u0444\3\2\2\2\u00ea\u0447\3\2\2\2\u00ec\u044a\3\2"+ + "\2\2\u00ee\u044d\3\2\2\2\u00f0\u044f\3\2\2\2\u00f2\u0452\3\2\2\2\u00f4"+ + "\u0454\3\2\2\2\u00f6\u0457\3\2\2\2\u00f8\u0459\3\2\2\2\u00fa\u045b\3\2"+ + "\2\2\u00fc\u045d\3\2\2\2\u00fe\u0460\3\2\2\2\u0100\u0463\3\2\2\2\u0102"+ + "\u0466\3\2\2\2\u0104\u0468\3\2\2\2\u0106\u046a\3\2\2\2\u0108\u046c\3\2"+ + "\2\2\u010a\u046e\3\2\2\2\u010c\u0470\3\2\2\2\u010e\u0472\3\2\2\2\u0110"+ + "\u0480\3\2\2\2\u0112\u0484\3\2\2\2\u0114\u0490\3\2\2\2\u0116\u049e\3\2"+ + "\2\2\u0118\u04aa\3\2\2\2\u011a\u04ce\3\2\2\2\u011c\u04d0\3\2\2\2\u011e"+ + "\u04d9\3\2\2\2\u0120\u04df\3\2\2\2\u0122\u04e6\3\2\2\2\u0124\u04ec\3\2"+ + "\2\2\u0126\u04ee\3\2\2\2\u0128\u04f3\3\2\2\2\u012a\u04f8\3\2\2\2\u012c"+ + "\u04ff\3\2\2\2\u012e\u050a\3\2\2\2\u0130\u0515\3\2\2\2\u0132\u0522\3\2"+ + "\2\2\u0134\u0528\3\2\2\2\u0136\u0537\3\2\2\2\u0138\u053d\3\2\2\2\u013a"+ + "\u054c\3\2\2\2\u013c\u054e\3\2\2\2\u013e\u056a\3\2\2\2\u0140\u0574\3\2"+ + "\2\2\u0142\u0576\3\2\2\2\u0144\u0578\3\2\2\2\u0146\u057a\3\2\2\2\u0148"+ + "\u0582\3\2\2\2\u014a\u0584\3\2\2\2\u014c\u0586\3\2\2\2\u014e\u0589\3\2"+ + "\2\2\u0150\u058f\3\2\2\2\u0152\u059d\3\2\2\2\u0154\u05ba\3\2\2\2\u0156"+ + "\u05be\3\2\2\2\u0158\u015b\5\6\3\2\u0159\u015b\5\u0118\u008c\2\u015a\u0158"+ + "\3\2\2\2\u015a\u0159\3\2\2\2\u015b\u015c\3\2\2\2\u015c\u015d\b\2\2\2\u015d"+ + "\5\3\2\2\2\u015e\u0168\5\u013e\u009f\2\u015f\u0160\7\60\2\2\u0160\u0162"+ + "\6\3\2\2\u0161\u0163\5\u013e\u009f\2\u0162\u0161\3\2\2\2\u0162\u0163\3"+ + "\2\2\2\u0163\u0165\3\2\2\2\u0164\u0166\5\u0146\u00a3\2\u0165\u0164\3\2"+ + "\2\2\u0165\u0166\3\2\2\2\u0166\u0169\3\2\2\2\u0167\u0169\5\u0146\u00a3"+ + "\2\u0168\u015f\3\2\2\2\u0168\u0167\3\2\2\2\u0169\u0171\3\2\2\2\u016a\u016b"+ + "\7\60\2\2\u016b\u016c\6\3\3\2\u016c\u016e\5\u013e\u009f\2\u016d\u016f"+ + "\5\u0146\u00a3\2\u016e\u016d\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0171\3"+ + "\2\2\2\u0170\u015e\3\2\2\2\u0170\u016a\3\2\2\2\u0171\7\3\2\2\2\u0172\u0173"+ + "\7v\2\2\u0173\u0174\7t\2\2\u0174\u0175\7w\2\2\u0175\u0176\7g\2\2\u0176"+ + "\u0177\3\2\2\2\u0177\u0178\b\4\2\2\u0178\t\3\2\2\2\u0179\u017a\7h\2\2"+ + "\u017a\u017b\7c\2\2\u017b\u017c\7n\2\2\u017c\u017d\7u\2\2\u017d\u017e"+ + "\7g\2\2\u017e\u017f\3\2\2\2\u017f\u0180\b\5\2\2\u0180\13\3\2\2\2\u0181"+ + "\u0182\7c\2\2\u0182\u0183\7u\2\2\u0183\u0184\7u\2\2\u0184\u0185\7g\2\2"+ + "\u0185\u0186\7t\2\2\u0186\u0187\7v\2\2\u0187\r\3\2\2\2\u0188\u0189\7c"+ + "\2\2\u0189\u018a\7u\2\2\u018a\u018b\7u\2\2\u018b\u018c\7w\2\2\u018c\u018d"+ + "\7o\2\2\u018d\u018e\7g\2\2\u018e\17\3\2\2\2\u018f\u0190\7k\2\2\u0190\u0191"+ + "\7p\2\2\u0191\u0192\7j\2\2\u0192\u0193\7c\2\2\u0193\u0194\7n\2\2\u0194"+ + "\u0195\7g\2\2\u0195\21\3\2\2\2\u0196\u0197\7g\2\2\u0197\u0198\7z\2\2\u0198"+ + "\u0199\7j\2\2\u0199\u019a\7c\2\2\u019a\u019b\7n\2\2\u019b\u019c\7g\2\2"+ + "\u019c\23\3\2\2\2\u019d\u019e\7t\2\2\u019e\u019f\7g\2\2\u019f\u01a0\7"+ + "s\2\2\u01a0\u01a1\7w\2\2\u01a1\u01a2\7k\2\2\u01a2\u01a3\7t\2\2\u01a3\u01a4"+ + "\7g\2\2\u01a4\u01a5\7u\2\2\u01a5\25\3\2\2\2\u01a6\u01a7\7r\2\2\u01a7\u01a8"+ + "\7t\2\2\u01a8\u01a9\7g\2\2\u01a9\u01aa\7u\2\2\u01aa\u01ab\7g\2\2\u01ab"+ + "\u01ac\7t\2\2\u01ac\u01ad\7x\2\2\u01ad\u01ae\7g\2\2\u01ae\u01af\7u\2\2"+ + "\u01af\27\3\2\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7p\2\2\u01b2\u01b3\7"+ + "u\2\2\u01b3\u01b4\7w\2\2\u01b4\u01b5\7t\2\2\u01b5\u01b6\7g\2\2\u01b6\u01b7"+ + "\7u\2\2\u01b7\31\3\2\2\2\u01b8\u01b9\7k\2\2\u01b9\u01ba\7p\2\2\u01ba\u01bb"+ + "\7x\2\2\u01bb\u01bc\7c\2\2\u01bc\u01bd\7t\2\2\u01bd\u01be\7k\2\2\u01be"+ + "\u01bf\7c\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2\u01c1\33\3\2\2\2\u01c2"+ + "\u01c3\7f\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7e\2\2\u01c5\u01c6\7t\2\2"+ + "\u01c6\u01c7\7g\2\2\u01c7\u01c8\7c\2\2\u01c8\u01c9\7u\2\2\u01c9\u01ca"+ + "\7g\2\2\u01ca\u01cb\7u\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01cd\b\16\2\2\u01cd"+ + "\35\3\2\2\2\u01ce\u01cf\7r\2\2\u01cf\u01d0\7w\2\2\u01d0\u01d1\7t\2\2\u01d1"+ + "\u01d2\7g\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\b\17\2\2\u01d4\37\3\2\2"+ + "\2\u01d5\u01d6\7k\2\2\u01d6\u01d7\7o\2\2\u01d7\u01d8\7r\2\2\u01d8\u01d9"+ + "\7n\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7o\2\2\u01db\u01dc\7g\2\2\u01dc"+ + "\u01dd\7p\2\2\u01dd\u01de\7v\2\2\u01de\u01df\7u\2\2\u01df!\3\2\2\2\u01e0"+ + "\u01e1\7c\2\2\u01e1\u01e2\7u\2\2\u01e2#\3\2\2\2\u01e3\u01e4\7q\2\2\u01e4"+ + "\u01e5\7n\2\2\u01e5\u01e6\7f\2\2\u01e6\u01e7\3\2\2\2\u01e7\u01e8\b\22"+ + "\2\2\u01e8%\3\2\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7g\2\2\u01eb\u01ec"+ + "\7h\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee\u01ef\7g\2\2\u01ef"+ + "\u01f0\3\2\2\2\u01f0\u01f1\b\23\2\2\u01f1\'\3\2\2\2\u01f2\u01f3\7%\2\2"+ + "\u01f3\u01f4\7n\2\2\u01f4\u01f5\7j\2\2\u01f5\u01f6\7u\2\2\u01f6)\3\2\2"+ + "\2\u01f7\u01f8\7h\2\2\u01f8\u01f9\7q\2\2\u01f9\u01fa\7t\2\2\u01fa\u01fb"+ + "\7c\2\2\u01fb\u01fc\7n\2\2\u01fc\u01fd\7n\2\2\u01fd+\3\2\2\2\u01fe\u01ff"+ + "\7g\2\2\u01ff\u0200\7z\2\2\u0200\u0201\7k\2\2\u0201\u0202\7u\2\2\u0202"+ + "\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204-\3\2\2\2\u0205\u0206\7c\2\2\u0206"+ + "\u0207\7e\2\2\u0207\u0208\7e\2\2\u0208\u0209\3\2\2\2\u0209\u020a\b\27"+ + "\2\2\u020a/\3\2\2\2\u020b\u020c\7h\2\2\u020c\u020d\7q\2\2\u020d\u020e"+ + "\7n\2\2\u020e\u020f\7f\2\2\u020f\61\3\2\2\2\u0210\u0211\7w\2\2\u0211\u0212"+ + "\7p\2\2\u0212\u0213\7h\2\2\u0213\u0214\7q\2\2\u0214\u0215\7n\2\2\u0215"+ + "\u0216\7f\2\2\u0216\63\3\2\2\2\u0217\u0218\7w\2\2\u0218\u0219\7p\2\2\u0219"+ + "\u021a\7h\2\2\u021a\u021b\7q\2\2\u021b\u021c\7n\2\2\u021c\u021d\7f\2\2"+ + "\u021d\u021e\7k\2\2\u021e\u021f\7p\2\2\u021f\u0220\7i\2\2\u0220\65\3\2"+ + "\2\2\u0221\u0222\7i\2\2\u0222\u0223\7j\2\2\u0223\u0224\7q\2\2\u0224\u0225"+ + "\7u\2\2\u0225\u0226\7v\2\2\u0226\67\3\2\2\2\u0227\u0228\7k\2\2\u0228\u0229"+ + "\7p\2\2\u02299\3\2\2\2\u022a\u022b\7%\2\2\u022b;\3\2\2\2\u022c\u022d\7"+ + "u\2\2\u022d\u022e\7w\2\2\u022e\u022f\7d\2\2\u022f\u0230\7u\2\2\u0230\u0231"+ + "\7g\2\2\u0231\u0232\7v\2\2\u0232=\3\2\2\2\u0233\u0234\7w\2\2\u0234\u0235"+ + "\7p\2\2\u0235\u0236\7k\2\2\u0236\u0237\7q\2\2\u0237\u0238\7p\2\2\u0238"+ + "?\3\2\2\2\u0239\u023a\7k\2\2\u023a\u023b\7p\2\2\u023b\u023c\7v\2\2\u023c"+ + "\u023d\7g\2\2\u023d\u023e\7t\2\2\u023e\u023f\7u\2\2\u023f\u0240\7g\2\2"+ + "\u0240\u0241\7e\2\2\u0241\u0242\7v\2\2\u0242\u0243\7k\2\2\u0243\u0244"+ + "\7q\2\2\u0244\u0245\7p\2\2\u0245A\3\2\2\2\u0246\u0247\7u\2\2\u0247\u0248"+ + "\7g\2\2\u0248\u0249\7v\2\2\u0249\u024a\7o\2\2\u024a\u024b\7k\2\2\u024b"+ + "\u024c\7p\2\2\u024c\u024d\7w\2\2\u024d\u024e\7u\2\2\u024eC\3\2\2\2\u024f"+ + "\u0250\7?\2\2\u0250\u0251\7?\2\2\u0251\u0252\7@\2\2\u0252E\3\2\2\2\u0253"+ + "\u0254\7/\2\2\u0254\u0255\7/\2\2\u0255\u0256\7,\2\2\u0256G\3\2\2\2\u0257"+ + "\u0258\7c\2\2\u0258\u0259\7r\2\2\u0259\u025a\7r\2\2\u025a\u025b\7n\2\2"+ + "\u025b\u025c\7{\2\2\u025cI\3\2\2\2\u025d\u025e\7A\2\2\u025eK\3\2\2\2\u025f"+ + "\u0260\7#\2\2\u0260\u0261\7>\2\2\u0261M\3\2\2\2\u0262\u0263\7#\2\2\u0263"+ + "\u0264\7@\2\2\u0264\u0265\3\2\2\2\u0265\u0266\b\'\2\2\u0266O\3\2\2\2\u0267"+ + "\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u026a\7s\2\2\u026a\u026b\3\2\2"+ + "\2\u026b\u026c\b(\2\2\u026cQ\3\2\2\2\u026d\u026e\7u\2\2\u026e\u026f\7"+ + "g\2\2\u026f\u0270\7v\2\2\u0270\u0271\3\2\2\2\u0271\u0272\b)\2\2\u0272"+ + "S\3\2\2\2\u0273\u0274\7o\2\2\u0274\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276"+ + "\u0277\7v\2\2\u0277\u0278\3\2\2\2\u0278\u0279\b*\2\2\u0279U\3\2\2\2\u027a"+ + "\u027b\7f\2\2\u027b\u027c\7k\2\2\u027c\u027d\7e\2\2\u027d\u027e\7v\2\2"+ + "\u027e\u027f\3\2\2\2\u027f\u0280\b+\2\2\u0280W\3\2\2\2\u0281\u0282\7q"+ + "\2\2\u0282\u0283\7r\2\2\u0283\u0284\7v\2\2\u0284\u0285\7k\2\2\u0285\u0286"+ + "\7q\2\2\u0286\u0287\7p\2\2\u0287\u0288\3\2\2\2\u0288\u0289\b,\2\2\u0289"+ + "Y\3\2\2\2\u028a\u028b\7n\2\2\u028b\u028c\7g\2\2\u028c\u028d\7p\2\2\u028d"+ + "\u028e\3\2\2\2\u028e\u028f\b-\2\2\u028f[\3\2\2\2\u0290\u0291\7p\2\2\u0291"+ + "\u0292\7g\2\2\u0292\u0293\7y\2\2\u0293\u0294\3\2\2\2\u0294\u0295\b.\2"+ + "\2\u0295]\3\2\2\2\u0296\u0297\7o\2\2\u0297\u0298\7c\2\2\u0298\u0299\7"+ + "m\2\2\u0299\u029a\7g\2\2\u029a\u029b\3\2\2\2\u029b\u029c\b/\2\2\u029c"+ + "_\3\2\2\2\u029d\u029e\7e\2\2\u029e\u029f\7c\2\2\u029f\u02a0\7r\2\2\u02a0"+ + "\u02a1\3\2\2\2\u02a1\u02a2\b\60\2\2\u02a2a\3\2\2\2\u02a3\u02a4\7u\2\2"+ + "\u02a4\u02a5\7q\2\2\u02a5\u02a6\7o\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8"+ + "\3\2\2\2\u02a8\u02a9\b\61\2\2\u02a9c\3\2\2\2\u02aa\u02ab\7i\2\2\u02ab"+ + "\u02ac\7g\2\2\u02ac\u02ad\7v\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02af\b\62"+ + "\2\2\u02afe\3\2\2\2\u02b0\u02b1\7f\2\2\u02b1\u02b2\7q\2\2\u02b2\u02b3"+ + "\7o\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7k\2\2\u02b5\u02b6\7p\2\2\u02b6"+ + "\u02b7\3\2\2\2\u02b7\u02b8\b\63\2\2\u02b8g\3\2\2\2\u02b9\u02ba\7c\2\2"+ + "\u02ba\u02bb\7z\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7q\2\2\u02bd\u02be"+ + "\7o\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\b\64\2\2\u02c0i\3\2\2\2\u02c1"+ + "\u02c2\7p\2\2\u02c2\u02c3\7q\2\2\u02c3\u02c4\7p\2\2\u02c4\u02c5\7g\2\2"+ + "\u02c5\u02c6\3\2\2\2\u02c6\u02c7\b\65\2\2\u02c7k\3\2\2\2\u02c8\u02c9\7"+ + "r\2\2\u02c9\u02ca\7t\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7f\2\2\u02ccm"+ + "\3\2\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7{\2\2\u02cf\u02d0\7r\2\2\u02d0"+ + "\u02d1\7g\2\2\u02d1\u02d2\7Q\2\2\u02d2\u02d3\7h\2\2\u02d3\u02d4\3\2\2"+ + "\2\u02d4\u02d5\b\67\2\2\u02d5o\3\2\2\2\u02d6\u02d7\7k\2\2\u02d7\u02d8"+ + "\7u\2\2\u02d8\u02d9\7E\2\2\u02d9\u02da\7q\2\2\u02da\u02db\7o\2\2\u02db"+ + "\u02dc\7r\2\2\u02dc\u02dd\7c\2\2\u02dd\u02de\7t\2\2\u02de\u02df\7c\2\2"+ + "\u02df\u02e0\7d\2\2\u02e0\u02e1\7n\2\2\u02e1\u02e2\7g\2\2\u02e2\u02e3"+ + "\3\2\2\2\u02e3\u02e4\b8\2\2\u02e4q\3\2\2\2\u02e5\u02e6\7u\2\2\u02e6\u02e7"+ + "\7j\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7g\2\2\u02ea"+ + "s\3\2\2\2\u02eb\u02ec\7B\2\2\u02ec\u02ed\3\2\2\2\u02ed\u02ee\b:\2\2\u02ee"+ + "u\3\2\2\2\u02ef\u02f0\7\60\2\2\u02f0\u02f1\7\60\2\2\u02f1w\3\2\2\2\u02f2"+ + "\u02f3\7u\2\2\u02f3\u02f4\7j\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7t\2\2"+ + "\u02f6\u02f7\7g\2\2\u02f7\u02f8\7f\2\2\u02f8y\3\2\2\2\u02f9\u02fa\7g\2"+ + "\2\u02fa\u02fb\7z\2\2\u02fb\u02fc\7e\2\2\u02fc\u02fd\7n\2\2\u02fd\u02fe"+ + "\7w\2\2\u02fe\u02ff\7u\2\2\u02ff\u0300\7k\2\2\u0300\u0301\7x\2\2\u0301"+ + "\u0302\7g\2\2\u0302{\3\2\2\2\u0303\u0304\7r\2\2\u0304\u0305\7t\2\2\u0305"+ + "\u0306\7g\2\2\u0306\u0307\7f\2\2\u0307\u0308\7k\2\2\u0308\u0309\7e\2\2"+ + "\u0309\u030a\7c\2\2\u030a\u030b\7v\2\2\u030b\u030c\7g\2\2\u030c}\3\2\2"+ + "\2\u030d\u030e\7y\2\2\u030e\u030f\7t\2\2\u030f\u0310\7k\2\2\u0310\u0311"+ + "\7v\2\2\u0311\u0312\7g\2\2\u0312\u0313\7R\2\2\u0313\u0314\7g\2\2\u0314"+ + "\u0315\7t\2\2\u0315\u0316\7o\2\2\u0316\u0317\3\2\2\2\u0317\u0318\b?\2"+ + "\2\u0318\177\3\2\2\2\u0319\u031a\7p\2\2\u031a\u031b\7q\2\2\u031b\u031c"+ + "\7R\2\2\u031c\u031d\7g\2\2\u031d\u031e\7t\2\2\u031e\u031f\7o\2\2\u031f"+ + "\u0320\3\2\2\2\u0320\u0321\b@\2\2\u0321\u0081\3\2\2\2\u0322\u0323\7v\2"+ + "\2\u0323\u0324\7t\2\2\u0324\u0325\7w\2\2\u0325\u0326\7u\2\2\u0326\u0327"+ + "\7v\2\2\u0327\u0328\7g\2\2\u0328\u0329\7f\2\2\u0329\u032a\3\2\2\2\u032a"+ + "\u032b\bA\2\2\u032b\u0083\3\2\2\2\u032c\u032d\7q\2\2\u032d\u032e\7w\2"+ + "\2\u032e\u032f\7v\2\2\u032f\u0330\7n\2\2\u0330\u0331\7k\2\2\u0331\u0332"+ + "\7p\2\2\u0332\u0333\7g\2\2\u0333\u0085\3\2\2\2\u0334\u0335\7k\2\2\u0335"+ + "\u0336\7p\2\2\u0336\u0337\7k\2\2\u0337\u0338\7v\2\2\u0338\u0339\7G\2\2"+ + "\u0339\u033a\7p\2\2\u033a\u033b\7u\2\2\u033b\u033c\7w\2\2\u033c\u033d"+ + "\7t\2\2\u033d\u033e\7g\2\2\u033e\u033f\7u\2\2\u033f\u0087\3\2\2\2\u0340"+ + "\u0341\7k\2\2\u0341\u0342\7o\2\2\u0342\u0343\7r\2\2\u0343\u0344\7q\2\2"+ + "\u0344\u0345\7t\2\2\u0345\u0346\7v\2\2\u0346\u0347\7T\2\2\u0347\u0348"+ + "\7g\2\2\u0348\u0349\7s\2\2\u0349\u034a\7w\2\2\u034a\u034b\7k\2\2\u034b"+ + "\u034c\7t\2\2\u034c\u034d\7g\2\2\u034d\u034e\7u\2\2\u034e\u0089\3\2\2"+ + "\2\u034f\u0350\7r\2\2\u0350\u0351\7t\2\2\u0351\u0352\7q\2\2\u0352\u0353"+ + "\7q\2\2\u0353\u0354\7h\2\2\u0354\u008b\3\2\2\2\u0355\u0356\7?\2\2\u0356"+ + "\u0357\7?\2\2\u0357\u0358\7?\2\2\u0358\u008d\3\2\2\2\u0359\u035a\7#\2"+ + "\2\u035a\u035b\7?\2\2\u035b\u035c\7?\2\2\u035c\u008f\3\2\2\2\u035d\u035e"+ + "\7y\2\2\u035e\u035f\7k\2\2\u035f\u0360\7v\2\2\u0360\u0361\7j\2\2\u0361"+ + "\u0091\3\2\2\2\u0362\u0363\7d\2\2\u0363\u0364\7t\2\2\u0364\u0365\7g\2"+ + "\2\u0365\u0366\7c\2\2\u0366\u0367\7m\2\2\u0367\u0368\3\2\2\2\u0368\u0369"+ + "\bI\2\2\u0369\u0093\3\2\2\2\u036a\u036b\7f\2\2\u036b\u036c\7g\2\2\u036c"+ + "\u036d\7h\2\2\u036d\u036e\7c\2\2\u036e\u036f\7w\2\2\u036f\u0370\7n\2\2"+ + "\u0370\u0371\7v\2\2\u0371\u0095\3\2\2\2\u0372\u0373\7h\2\2\u0373\u0374"+ + "\7w\2\2\u0374\u0375\7p\2\2\u0375\u0376\7e\2\2\u0376\u0097\3\2\2\2\u0377"+ + "\u0378\7k\2\2\u0378\u0379\7p\2\2\u0379\u037a\7v\2\2\u037a\u037b\7g\2\2"+ + "\u037b\u037c\7t\2\2\u037c\u037d\7h\2\2\u037d\u037e\7c\2\2\u037e\u037f"+ + "\7e\2\2\u037f\u0380\7g\2\2\u0380\u0099\3\2\2\2\u0381\u0382\7u\2\2\u0382"+ + "\u0383\7g\2\2\u0383\u0384\7n\2\2\u0384\u0385\7g\2\2\u0385\u0386\7e\2\2"+ + "\u0386\u0387\7v\2\2\u0387\u009b\3\2\2\2\u0388\u0389\7e\2\2\u0389\u038a"+ + "\7c\2\2\u038a\u038b\7u\2\2\u038b\u038c\7g\2\2\u038c\u009d\3\2\2\2\u038d"+ + "\u038e\7f\2\2\u038e\u038f\7g\2\2\u038f\u0390\7h\2\2\u0390\u0391\7g\2\2"+ + "\u0391\u0392\7t\2\2\u0392\u009f\3\2\2\2\u0393\u0394\7i\2\2\u0394\u0395"+ + "\7q\2\2\u0395\u00a1\3\2\2\2\u0396\u0397\7o\2\2\u0397\u0398\7c\2\2\u0398"+ + "\u0399\7r\2\2\u0399\u00a3\3\2\2\2\u039a\u039b\7u\2\2\u039b\u039c\7v\2"+ + "\2\u039c\u039d\7t\2\2\u039d\u039e\7w\2\2\u039e\u039f\7e\2\2\u039f\u03a0"+ + "\7v\2\2\u03a0\u00a5\3\2\2\2\u03a1\u03a2\7e\2\2\u03a2\u03a3\7j\2\2\u03a3"+ + "\u03a4\7c\2\2\u03a4\u03a5\7p\2\2\u03a5\u00a7\3\2\2\2\u03a6\u03a7\7g\2"+ + "\2\u03a7\u03a8\7n\2\2\u03a8\u03a9\7u\2\2\u03a9\u03aa\7g\2\2\u03aa\u00a9"+ + "\3\2\2\2\u03ab\u03ac\7i\2\2\u03ac\u03ad\7q\2\2\u03ad\u03ae\7v\2\2\u03ae"+ + "\u03af\7q\2\2\u03af\u00ab\3\2\2\2\u03b0\u03b1\7r\2\2\u03b1\u03b2\7c\2"+ + "\2\u03b2\u03b3\7e\2\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\7c\2\2\u03b5\u03b6"+ + "\7i\2\2\u03b6\u03b7\7g\2\2\u03b7\u00ad\3\2\2\2\u03b8\u03b9\7u\2\2\u03b9"+ + "\u03ba\7y\2\2\u03ba\u03bb\7k\2\2\u03bb\u03bc\7v\2\2\u03bc\u03bd\7e\2\2"+ + "\u03bd\u03be\7j\2\2\u03be\u00af\3\2\2\2\u03bf\u03c0\7e\2\2\u03c0\u03c1"+ + "\7q\2\2\u03c1\u03c2\7p\2\2\u03c2\u03c3\7u\2\2\u03c3\u03c4\7v\2\2\u03c4"+ + "\u00b1\3\2\2\2\u03c5\u03c6\7h\2\2\u03c6\u03c7\7c\2\2\u03c7\u03c8\7n\2"+ + "\2\u03c8\u03c9\7n\2\2\u03c9\u03ca\7v\2\2\u03ca\u03cb\7j\2\2\u03cb\u03cc"+ + "\7t\2\2\u03cc\u03cd\7q\2\2\u03cd\u03ce\7w\2\2\u03ce\u03cf\7i\2\2\u03cf"+ + "\u03d0\7j\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2\bY\2\2\u03d2\u00b3\3\2\2"+ + "\2\u03d3\u03d4\7k\2\2\u03d4\u03d5\7h\2\2\u03d5\u00b5\3\2\2\2\u03d6\u03d7"+ + "\7t\2\2\u03d7\u03d8\7c\2\2\u03d8\u03d9\7p\2\2\u03d9\u03da\7i\2\2\u03da"+ + "\u03db\7g\2\2\u03db\u00b7\3\2\2\2\u03dc\u03dd\7v\2\2\u03dd\u03de\7{\2"+ + "\2\u03de\u03df\7r\2\2\u03df\u03e0\7g\2\2\u03e0\u00b9\3\2\2\2\u03e1\u03e2"+ + "\7e\2\2\u03e2\u03e3\7q\2\2\u03e3\u03e4\7p\2\2\u03e4\u03e5\7v\2\2\u03e5"+ + "\u03e6\7k\2\2\u03e6\u03e7\7p\2\2\u03e7\u03e8\7w\2\2\u03e8\u03e9\7g\2\2"+ + "\u03e9\u03ea\3\2\2\2\u03ea\u03eb\b]\2\2\u03eb\u00bb\3\2\2\2\u03ec\u03ed"+ + "\7h\2\2\u03ed\u03ee\7q\2\2\u03ee\u03ef\7t\2\2\u03ef\u00bd\3\2\2\2\u03f0"+ + "\u03f1\7k\2\2\u03f1\u03f2\7o\2\2\u03f2\u03f3\7r\2\2\u03f3\u03f4\7q\2\2"+ + "\u03f4\u03f5\7t\2\2\u03f5\u03f6\7v\2\2\u03f6\u00bf\3\2\2\2\u03f7\u03f8"+ + "\7t\2\2\u03f8\u03f9\7g\2\2\u03f9\u03fa\7v\2\2\u03fa\u03fb\7w\2\2\u03fb"+ + "\u03fc\7t\2\2\u03fc\u03fd\7p\2\2\u03fd\u03fe\3\2\2\2\u03fe\u03ff\b`\2"+ + "\2\u03ff\u00c1\3\2\2\2\u0400\u0401\7x\2\2\u0401\u0402\7c\2\2\u0402\u0403"+ + "\7t\2\2\u0403\u00c3\3\2\2\2\u0404\u0405\7p\2\2\u0405\u0406\7k\2\2\u0406"+ + "\u0407\7n\2\2\u0407\u0408\3\2\2\2\u0408\u0409\bb\2\2\u0409\u00c5\3\2\2"+ + "\2\u040a\u040f\5\u0148\u00a4\2\u040b\u040e\5\u0148\u00a4\2\u040c\u040e"+ + "\5\u014a\u00a5\2\u040d\u040b\3\2\2\2\u040d\u040c\3\2\2\2\u040e\u0411\3"+ + "\2\2\2\u040f\u040d\3\2\2\2\u040f\u0410\3\2\2\2\u0410\u0412\3\2\2\2\u0411"+ + "\u040f\3\2\2\2\u0412\u0413\bc\2\2\u0413\u00c7\3\2\2\2\u0414\u0415\7*\2"+ + "\2\u0415\u00c9\3\2\2\2\u0416\u0417\7+\2\2\u0417\u0418\3\2\2\2\u0418\u0419"+ + "\be\2\2\u0419\u00cb\3\2\2\2\u041a\u041b\7}\2\2\u041b\u00cd\3\2\2\2\u041c"+ + "\u041d\7\177\2\2\u041d\u041e\3\2\2\2\u041e\u041f\bg\2\2\u041f\u00cf\3"+ + "\2\2\2\u0420\u0421\7]\2\2\u0421\u00d1\3\2\2\2\u0422\u0423\7_\2\2\u0423"+ + "\u0424\3\2\2\2\u0424\u0425\bi\2\2\u0425\u00d3\3\2\2\2\u0426\u0427\7?\2"+ + "\2\u0427\u00d5\3\2\2\2\u0428\u0429\7.\2\2\u0429\u00d7\3\2\2\2\u042a\u042b"+ + "\7=\2\2\u042b\u00d9\3\2\2\2\u042c\u042d\7<\2\2\u042d\u00db\3\2\2\2\u042e"+ + "\u042f\7\60\2\2\u042f\u00dd\3\2\2\2\u0430\u0431\7-\2\2\u0431\u0432\7-"+ + "\2\2\u0432\u0433\3\2\2\2\u0433\u0434\bo\2\2\u0434\u00df\3\2\2\2\u0435"+ + "\u0436\7/\2\2\u0436\u0437\7/\2\2\u0437\u0438\3\2\2\2\u0438\u0439\bp\2"+ + "\2\u0439\u00e1\3\2\2\2\u043a\u043b\7<\2\2\u043b\u043c\7?\2\2\u043c\u00e3"+ + "\3\2\2\2\u043d\u043e\7\60\2\2\u043e\u043f\7\60\2\2\u043f\u0440\7\60\2"+ + "\2\u0440\u00e5\3\2\2\2\u0441\u0442\7~\2\2\u0442\u0443\7~\2\2\u0443\u00e7"+ + "\3\2\2\2\u0444\u0445\7(\2\2\u0445\u0446\7(\2\2\u0446\u00e9\3\2\2\2\u0447"+ + "\u0448\7?\2\2\u0448\u0449\7?\2\2\u0449\u00eb\3\2\2\2\u044a\u044b\7#\2"+ + "\2\u044b\u044c\7?\2\2\u044c\u00ed\3\2\2\2\u044d\u044e\7>\2\2\u044e\u00ef"+ + "\3\2\2\2\u044f\u0450\7>\2\2\u0450\u0451\7?\2\2\u0451\u00f1\3\2\2\2\u0452"+ + "\u0453\7@\2\2\u0453\u00f3\3\2\2\2\u0454\u0455\7@\2\2\u0455\u0456\7?\2"+ + "\2\u0456\u00f5\3\2\2\2\u0457\u0458\7~\2\2\u0458\u00f7\3\2\2\2\u0459\u045a"+ + "\7\61\2\2\u045a\u00f9\3\2\2\2\u045b\u045c\7\'\2\2\u045c\u00fb\3\2\2\2"+ + "\u045d\u045e\7>\2\2\u045e\u045f\7>\2\2\u045f\u00fd\3\2\2\2\u0460\u0461"+ + "\7@\2\2\u0461\u0462\7@\2\2\u0462\u00ff\3\2\2\2\u0463\u0464\7(\2\2\u0464"+ + "\u0465\7`\2\2\u0465\u0101\3\2\2\2\u0466\u0467\7#\2\2\u0467\u0103\3\2\2"+ + "\2\u0468\u0469\7-\2\2\u0469\u0105\3\2\2\2\u046a\u046b\7/\2\2\u046b\u0107"+ + "\3\2\2\2\u046c\u046d\7`\2\2\u046d\u0109\3\2\2\2\u046e\u046f\7,\2\2\u046f"+ + "\u010b\3\2\2\2\u0470\u0471\7(\2\2\u0471\u010d\3\2\2\2\u0472\u0473\7>\2"+ + "\2\u0473\u0474\7/\2\2\u0474\u010f\3\2\2\2\u0475\u0481\7\62\2\2\u0476\u047d"+ + "\t\2\2\2\u0477\u0479\7a\2\2\u0478\u0477\3\2\2\2\u0478\u0479\3\2\2\2\u0479"+ + "\u047a\3\2\2\2\u047a\u047c\t\3\2\2\u047b\u0478\3\2\2\2\u047c\u047f\3\2"+ + "\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481\3\2\2\2\u047f"+ + "\u047d\3\2\2\2\u0480\u0475\3\2\2\2\u0480\u0476\3\2\2\2\u0481\u0482\3\2"+ + "\2\2\u0482\u0483\b\u0088\2\2\u0483\u0111\3\2\2\2\u0484\u0485\7\62\2\2"+ + "\u0485\u048a\t\4\2\2\u0486\u0488\7a\2\2\u0487\u0486\3\2\2\2\u0487\u0488"+ + "\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048b\5\u0144\u00a2\2\u048a\u0487\3"+ + "\2\2\2\u048b\u048c\3\2\2\2\u048c\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+ + "\u048e\3\2\2\2\u048e\u048f\b\u0089\2\2\u048f\u0113\3\2\2\2\u0490\u0492"+ + "\7\62\2\2\u0491\u0493\t\5\2\2\u0492\u0491\3\2\2\2\u0492\u0493\3\2\2\2"+ + "\u0493\u0498\3\2\2\2\u0494\u0496\7a\2\2\u0495\u0494\3\2\2\2\u0495\u0496"+ + "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0499\5\u0140\u00a0\2\u0498\u0495\3"+ + "\2\2\2\u0499\u049a\3\2\2\2\u049a\u0498\3\2\2\2\u049a\u049b\3\2\2\2\u049b"+ + "\u049c\3\2\2\2\u049c\u049d\b\u008a\2\2\u049d\u0115\3\2\2\2\u049e\u049f"+ + "\7\62\2\2\u049f\u04a4\t\6\2\2\u04a0\u04a2\7a\2\2\u04a1\u04a0\3\2\2\2\u04a1"+ + "\u04a2\3\2\2\2\u04a2\u04a3\3\2\2\2\u04a3\u04a5\5\u0142\u00a1\2\u04a4\u04a1"+ + "\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a4\3\2\2\2\u04a6\u04a7\3\2\2\2\u04a7"+ + "\u04a8\3\2\2\2\u04a8\u04a9\b\u008b\2\2\u04a9\u0117\3\2\2\2\u04aa\u04ab"+ + "\7\62\2\2\u04ab\u04ac\t\6\2\2\u04ac\u04ad\5\u011a\u008d\2\u04ad\u04ae"+ + "\5\u011c\u008e\2\u04ae\u0119\3\2\2\2\u04af\u04b1\7a\2\2\u04b0\u04af\3"+ + "\2\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2\u04b4\5\u0142\u00a1"+ + "\2\u04b3\u04b0\3\2\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b3\3\2\2\2\u04b5\u04b6"+ + "\3\2\2\2\u04b6\u04c1\3\2\2\2\u04b7\u04be\7\60\2\2\u04b8\u04ba\7a\2\2\u04b9"+ + "\u04b8\3\2\2\2\u04b9\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bd\5\u0142"+ + "\u00a1\2\u04bc\u04b9\3\2\2\2\u04bd\u04c0\3\2\2\2\u04be\u04bc\3\2\2\2\u04be"+ + "\u04bf\3\2\2\2\u04bf\u04c2\3\2\2\2\u04c0\u04be\3\2\2\2\u04c1\u04b7\3\2"+ + "\2\2\u04c1\u04c2\3\2\2\2\u04c2\u04cf\3\2\2\2\u04c3\u04c4\7\60\2\2\u04c4"+ + "\u04cb\5\u0142\u00a1\2\u04c5\u04c7\7a\2\2\u04c6\u04c5\3\2\2\2\u04c6\u04c7"+ + "\3\2\2\2\u04c7\u04c8\3\2\2\2\u04c8\u04ca\5\u0142\u00a1\2\u04c9\u04c6\3"+ + "\2\2\2\u04ca\u04cd\3\2\2\2\u04cb\u04c9\3\2\2\2\u04cb\u04cc\3\2\2\2\u04cc"+ + "\u04cf\3\2\2\2\u04cd\u04cb\3\2\2\2\u04ce\u04b3\3\2\2\2\u04ce\u04c3\3\2"+ + "\2\2\u04cf\u011b\3\2\2\2\u04d0\u04d1\t\7\2\2\u04d1\u04d2\t\b\2\2\u04d2"+ + "\u04d3\5\u013e\u009f\2\u04d3\u011d\3\2\2\2\u04d4\u04da\5\u0110\u0088\2"+ + "\u04d5\u04da\5\u0112\u0089\2\u04d6\u04da\5\u0114\u008a\2\u04d7\u04da\5"+ + "\u0116\u008b\2\u04d8\u04da\5\4\2\2\u04d9\u04d4\3\2\2\2\u04d9\u04d5\3\2"+ + "\2\2\u04d9\u04d6\3\2\2\2\u04d9\u04d7\3\2\2\2\u04d9\u04d8\3\2\2\2\u04da"+ + "\u04db\3\2\2\2\u04db\u04dc\7k\2\2\u04dc\u04dd\3\2\2\2\u04dd\u04de\b\u008f"+ + "\2\2\u04de\u011f\3\2\2\2\u04df\u04e2\7)\2\2\u04e0\u04e3\5\u013a\u009d"+ + "\2\u04e1\u04e3\5\u0124\u0092\2\u04e2\u04e0\3\2\2\2\u04e2\u04e1\3\2\2\2"+ + "\u04e3\u04e4\3\2\2\2\u04e4\u04e5\7)\2\2\u04e5\u0121\3\2\2\2\u04e6\u04e7"+ + "\5\u0120\u0090\2\u04e7\u04e8\3\2\2\2\u04e8\u04e9\b\u0091\2\2\u04e9\u0123"+ + "\3\2\2\2\u04ea\u04ed\5\u0126\u0093\2\u04eb\u04ed\5\u0128\u0094\2\u04ec"+ + "\u04ea\3\2\2\2\u04ec\u04eb\3\2\2\2\u04ed\u0125\3\2\2\2\u04ee\u04ef\7^"+ + "\2\2\u04ef\u04f0\5\u0140\u00a0\2\u04f0\u04f1\5\u0140\u00a0\2\u04f1\u04f2"+ + "\5\u0140\u00a0\2\u04f2\u0127\3\2\2\2\u04f3\u04f4\7^\2\2\u04f4\u04f5\7"+ + "z\2\2\u04f5\u04f6\5\u0142\u00a1\2\u04f6\u04f7\5\u0142\u00a1\2\u04f7\u0129"+ + "\3\2\2\2\u04f8\u04f9\7^\2\2\u04f9\u04fa\7w\2\2\u04fa\u04fb\5\u0142\u00a1"+ + "\2\u04fb\u04fc\5\u0142\u00a1\2\u04fc\u04fd\5\u0142\u00a1\2\u04fd\u04fe"+ + "\5\u0142\u00a1\2\u04fe\u012b\3\2\2\2\u04ff\u0500\7^\2\2\u0500\u0501\7"+ + "W\2\2\u0501\u0502\5\u0142\u00a1\2\u0502\u0503\5\u0142\u00a1\2\u0503\u0504"+ + "\5\u0142\u00a1\2\u0504\u0505\5\u0142\u00a1\2\u0505\u0506\5\u0142\u00a1"+ + "\2\u0506\u0507\5\u0142\u00a1\2\u0507\u0508\5\u0142\u00a1\2\u0508\u0509"+ + "\5\u0142\u00a1\2\u0509\u012d\3\2\2\2\u050a\u050e\7b\2\2\u050b\u050d\n"+ + "\t\2\2\u050c\u050b\3\2\2\2\u050d\u0510\3\2\2\2\u050e\u050c\3\2\2\2\u050e"+ + "\u050f\3\2\2\2\u050f\u0511\3\2\2\2\u0510\u050e\3\2\2\2\u0511\u0512\7b"+ + "\2\2\u0512\u0513\3\2\2\2\u0513\u0514\b\u0097\2\2\u0514\u012f\3\2\2\2\u0515"+ + "\u051a\7$\2\2\u0516\u0519\n\n\2\2\u0517\u0519\5\u013c\u009e\2\u0518\u0516"+ + "\3\2\2\2\u0518\u0517\3\2\2\2\u0519\u051c\3\2\2\2\u051a\u0518\3\2\2\2\u051a"+ + "\u051b\3\2\2\2\u051b\u051d\3\2\2\2\u051c\u051a\3\2\2\2\u051d\u051e\7$"+ + "\2\2\u051e\u051f\3\2\2\2\u051f\u0520\b\u0098\2\2\u0520\u0131\3\2\2\2\u0521"+ + "\u0523\t\13\2\2\u0522\u0521\3\2\2\2\u0523\u0524\3\2\2\2\u0524\u0522\3"+ + "\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526\u0527\b\u0099\3\2"+ + "\u0527\u0133\3\2\2\2\u0528\u0529\7\61\2\2\u0529\u052a\7,\2\2\u052a\u052e"+ + "\3\2\2\2\u052b\u052d\13\2\2\2\u052c\u052b\3\2\2\2\u052d\u0530\3\2\2\2"+ + "\u052e\u052f\3\2\2\2\u052e\u052c\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052e"+ + "\3\2\2\2\u0531\u0532\7,\2\2\u0532\u0533\7\61\2\2\u0533\u0534\3\2\2\2\u0534"+ + "\u0535\b\u009a\3\2\u0535\u0135\3\2\2\2\u0536\u0538\t\f\2\2\u0537\u0536"+ + "\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u0537\3\2\2\2\u0539\u053a\3\2\2\2\u053a"+ + "\u053b\3\2\2\2\u053b\u053c\b\u009b\3\2\u053c\u0137\3\2\2\2\u053d\u053e"+ + "\7\61\2\2\u053e\u053f\7\61\2\2\u053f\u0543\3\2\2\2\u0540\u0542\n\f\2\2"+ + "\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3\2\2\2\u0543\u0544"+ + "\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543\3\2\2\2\u0546\u0547\b\u009c\3"+ + "\2\u0547\u0139\3\2\2\2\u0548\u054d\n\r\2\2\u0549\u054d\5\u012a\u0095\2"+ + "\u054a\u054d\5\u012c\u0096\2\u054b\u054d\5\u013c\u009e\2\u054c\u0548\3"+ + "\2\2\2\u054c\u0549\3\2\2\2\u054c\u054a\3\2\2\2\u054c\u054b\3\2\2\2\u054d"+ + "\u013b\3\2\2\2\u054e\u0568\7^\2\2\u054f\u0550\7w\2\2\u0550\u0551\5\u0142"+ + "\u00a1\2\u0551\u0552\5\u0142\u00a1\2\u0552\u0553\5\u0142\u00a1\2\u0553"+ + "\u0554\5\u0142\u00a1\2\u0554\u0569\3\2\2\2\u0555\u0556\7W\2\2\u0556\u0557"+ + "\5\u0142\u00a1\2\u0557\u0558\5\u0142\u00a1\2\u0558\u0559\5\u0142\u00a1"+ + "\2\u0559\u055a\5\u0142\u00a1\2\u055a\u055b\5\u0142\u00a1\2\u055b\u055c"+ + "\5\u0142\u00a1\2\u055c\u055d\5\u0142\u00a1\2\u055d\u055e\5\u0142\u00a1"+ + "\2\u055e\u0569\3\2\2\2\u055f\u0569\t\16\2\2\u0560\u0561\5\u0140\u00a0"+ + "\2\u0561\u0562\5\u0140\u00a0\2\u0562\u0563\5\u0140\u00a0\2\u0563\u0569"+ + "\3\2\2\2\u0564\u0565\7z\2\2\u0565\u0566\5\u0142\u00a1\2\u0566\u0567\5"+ + "\u0142\u00a1\2\u0567\u0569\3\2\2\2\u0568\u054f\3\2\2\2\u0568\u0555\3\2"+ + "\2\2\u0568\u055f\3\2\2\2\u0568\u0560\3\2\2\2\u0568\u0564\3\2\2\2\u0569"+ + "\u013d\3\2\2\2\u056a\u0571\t\3\2\2\u056b\u056d\7a\2\2\u056c\u056b\3\2"+ + "\2\2\u056c\u056d\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u0570\t\3\2\2\u056f"+ + "\u056c\3\2\2\2\u0570\u0573\3\2\2\2\u0571\u056f\3\2\2\2\u0571\u0572\3\2"+ + "\2\2\u0572\u013f\3\2\2\2\u0573\u0571\3\2\2\2\u0574\u0575\t\17\2\2\u0575"+ + "\u0141\3\2\2\2\u0576\u0577\t\20\2\2\u0577\u0143\3\2\2\2\u0578\u0579\t"+ + "\21\2\2\u0579\u0145\3\2\2\2\u057a\u057c\t\22\2\2\u057b\u057d\t\b\2\2\u057c"+ + "\u057b\3\2\2\2\u057c\u057d\3\2\2\2\u057d\u057e\3\2\2\2\u057e\u057f\5\u013e"+ + "\u009f\2\u057f\u0147\3\2\2\2\u0580\u0583\5\u014c\u00a6\2\u0581\u0583\7"+ + "a\2\2\u0582\u0580\3\2\2\2\u0582\u0581\3\2\2\2\u0583\u0149\3\2\2\2\u0584"+ + "\u0585\t\23\2\2\u0585\u014b\3\2\2\2\u0586\u0587\t\24\2\2\u0587\u014d\3"+ + "\2\2\2\u0588\u058a\t\13\2\2\u0589\u0588\3\2\2\2\u058a\u058b\3\2\2\2\u058b"+ + "\u0589\3\2\2\2\u058b\u058c\3\2\2\2\u058c\u058d\3\2\2\2\u058d\u058e\b\u00a7"+ + "\3\2\u058e\u014f\3\2\2\2\u058f\u0590\7\61\2\2\u0590\u0591\7,\2\2\u0591"+ + "\u0595\3\2\2\2\u0592\u0594\n\f\2\2\u0593\u0592\3\2\2\2\u0594\u0597\3\2"+ + "\2\2\u0595\u0596\3\2\2\2\u0595\u0593\3\2\2\2\u0596\u0598\3\2\2\2\u0597"+ + "\u0595\3\2\2\2\u0598\u0599\7,\2\2\u0599\u059a\7\61\2\2\u059a\u059b\3\2"+ + "\2\2\u059b\u059c\b\u00a8\3\2\u059c\u0151\3\2\2\2\u059d\u059e\7\61\2\2"+ + "\u059e\u059f\7\61\2\2\u059f\u05a3\3\2\2\2\u05a0\u05a2\n\f\2\2\u05a1\u05a0"+ + "\3\2\2\2\u05a2\u05a5\3\2\2\2\u05a3\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+ + "\u05a6\3\2\2\2\u05a5\u05a3\3\2\2\2\u05a6\u05a7\b\u00a9\3\2\u05a7\u0153"+ + "\3\2\2\2\u05a8\u05aa\t\f\2\2\u05a9\u05a8\3\2\2\2\u05aa\u05ab\3\2\2\2\u05ab"+ + "\u05a9\3\2\2\2\u05ab\u05ac\3\2\2\2\u05ac\u05bb\3\2\2\2\u05ad\u05bb\7="+ + "\2\2\u05ae\u05af\7\61\2\2\u05af\u05b0\7,\2\2\u05b0\u05b4\3\2\2\2\u05b1"+ + "\u05b3\13\2\2\2\u05b2\u05b1\3\2\2\2\u05b3\u05b6\3\2\2\2\u05b4\u05b5\3"+ + "\2\2\2\u05b4\u05b2\3\2\2\2\u05b5\u05b7\3\2\2\2\u05b6\u05b4\3\2\2\2\u05b7"+ + "\u05b8\7,\2\2\u05b8\u05bb\7\61\2\2\u05b9\u05bb\7\2\2\3\u05ba\u05a9\3\2"+ + "\2\2\u05ba\u05ad\3\2\2\2\u05ba\u05ae\3\2\2\2\u05ba\u05b9\3\2\2\2\u05bb"+ + "\u05bc\3\2\2\2\u05bc\u05bd\b\u00aa\4\2\u05bd\u0155\3\2\2\2\u05be\u05bf"+ + "\3\2\2\2\u05bf\u05c0\3\2\2\2\u05c0\u05c1\b\u00ab\4\2\u05c1\u05c2\b\u00ab"+ + "\3\2\u05c2\u0157\3\2\2\2\64\2\3\u015a\u0162\u0165\u0168\u016e\u0170\u040d"+ + "\u040f\u0478\u047d\u0480\u0487\u048c\u0492\u0495\u049a\u04a1\u04a6\u04b0"+ + "\u04b5\u04b9\u04be\u04c1\u04c6\u04cb\u04ce\u04d9\u04e2\u04ec\u050e\u0518"+ + "\u051a\u0524\u052e\u0539\u0543\u054c\u0568\u056c\u0571\u057c\u0582\u058b"+ + "\u0595\u05a3\u05ab\u05b4\u05ba\5\4\3\2\2\3\2\4\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/viper/gobra/frontend/GobraParser.java b/src/main/java/viper/gobra/frontend/GobraParser.java index 3031c6145..045338bf7 100644 --- a/src/main/java/viper/gobra/frontend/GobraParser.java +++ b/src/main/java/viper/gobra/frontend/GobraParser.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -11,7 +11,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class GobraParser extends GobraParserBase { - static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.9.1", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -27,21 +27,21 @@ public class GobraParser extends GobraParserBase { PRED=53, TYPE_OF=54, IS_COMPARABLE=55, SHARE=56, ADDR_MOD=57, DOT_DOT=58, SHARED=59, EXCLUSIVE=60, PREDICATE=61, WRITEPERM=62, NOPERM=63, TRUSTED=64, OUTLINE=65, INIT_POST=66, IMPORT_PRE=67, PROOF=68, GHOST_EQUALS=69, GHOST_NOT_EQUALS=70, - BREAK=71, DEFAULT=72, FUNC=73, INTERFACE=74, SELECT=75, CASE=76, DEFER=77, - GO=78, MAP=79, STRUCT=80, CHAN=81, ELSE=82, GOTO=83, PACKAGE=84, SWITCH=85, - CONST=86, FALLTHROUGH=87, IF=88, RANGE=89, TYPE=90, CONTINUE=91, FOR=92, - IMPORT=93, RETURN=94, VAR=95, NIL_LIT=96, IDENTIFIER=97, L_PAREN=98, R_PAREN=99, - L_CURLY=100, R_CURLY=101, L_BRACKET=102, R_BRACKET=103, ASSIGN=104, COMMA=105, - SEMI=106, COLON=107, DOT=108, PLUS_PLUS=109, MINUS_MINUS=110, DECLARE_ASSIGN=111, - ELLIPSIS=112, LOGICAL_OR=113, LOGICAL_AND=114, EQUALS=115, NOT_EQUALS=116, - LESS=117, LESS_OR_EQUALS=118, GREATER=119, GREATER_OR_EQUALS=120, OR=121, - DIV=122, MOD=123, LSHIFT=124, RSHIFT=125, BIT_CLEAR=126, EXCLAMATION=127, - PLUS=128, MINUS=129, CARET=130, STAR=131, AMPERSAND=132, RECEIVE=133, - DECIMAL_LIT=134, BINARY_LIT=135, OCTAL_LIT=136, HEX_LIT=137, HEX_FLOAT_LIT=138, - IMAGINARY_LIT=139, RUNE_LIT=140, BYTE_VALUE=141, OCTAL_BYTE_VALUE=142, - HEX_BYTE_VALUE=143, LITTLE_U_VALUE=144, BIG_U_VALUE=145, RAW_STRING_LIT=146, - INTERPRETED_STRING_LIT=147, WS=148, COMMENT=149, TERMINATOR=150, LINE_COMMENT=151, - WS_NLSEMI=152, COMMENT_NLSEMI=153, LINE_COMMENT_NLSEMI=154, EOS=155, OTHER=156; + WITH=71, BREAK=72, DEFAULT=73, FUNC=74, INTERFACE=75, SELECT=76, CASE=77, + DEFER=78, GO=79, MAP=80, STRUCT=81, CHAN=82, ELSE=83, GOTO=84, PACKAGE=85, + SWITCH=86, CONST=87, FALLTHROUGH=88, IF=89, RANGE=90, TYPE=91, CONTINUE=92, + FOR=93, IMPORT=94, RETURN=95, VAR=96, NIL_LIT=97, IDENTIFIER=98, L_PAREN=99, + R_PAREN=100, L_CURLY=101, R_CURLY=102, L_BRACKET=103, R_BRACKET=104, ASSIGN=105, + COMMA=106, SEMI=107, COLON=108, DOT=109, PLUS_PLUS=110, MINUS_MINUS=111, + DECLARE_ASSIGN=112, ELLIPSIS=113, LOGICAL_OR=114, LOGICAL_AND=115, EQUALS=116, + NOT_EQUALS=117, LESS=118, LESS_OR_EQUALS=119, GREATER=120, GREATER_OR_EQUALS=121, + OR=122, DIV=123, MOD=124, LSHIFT=125, RSHIFT=126, BIT_CLEAR=127, EXCLAMATION=128, + PLUS=129, MINUS=130, CARET=131, STAR=132, AMPERSAND=133, RECEIVE=134, + DECIMAL_LIT=135, BINARY_LIT=136, OCTAL_LIT=137, HEX_LIT=138, HEX_FLOAT_LIT=139, + IMAGINARY_LIT=140, RUNE_LIT=141, BYTE_VALUE=142, OCTAL_BYTE_VALUE=143, + HEX_BYTE_VALUE=144, LITTLE_U_VALUE=145, BIG_U_VALUE=146, RAW_STRING_LIT=147, + INTERPRETED_STRING_LIT=148, WS=149, COMMENT=150, TERMINATOR=151, LINE_COMMENT=152, + WS_NLSEMI=153, COMMENT_NLSEMI=154, LINE_COMMENT_NLSEMI=155, EOS=156, OTHER=157; public static final int RULE_exprOnly = 0, RULE_stmtOnly = 1, RULE_typeOnly = 2, RULE_maybeAddressableIdentifierList = 3, RULE_maybeAddressableIdentifier = 4, RULE_sourceFile = 5, RULE_initPost = 6, @@ -70,29 +70,29 @@ public class GobraParser extends GobraParserBase { RULE_interfaceType = 84, RULE_predicateSpec = 85, RULE_methodSpec = 86, RULE_type_ = 87, RULE_typeLit = 88, RULE_predType = 89, RULE_predTypeParams = 90, RULE_literalType = 91, RULE_implicitArray = 92, RULE_slice_ = 93, RULE_low = 94, - RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_packageClause = 98, - RULE_importPath = 99, RULE_declaration = 100, RULE_constDecl = 101, RULE_constSpec = 102, - RULE_identifierList = 103, RULE_expressionList = 104, RULE_typeDecl = 105, - RULE_typeSpec = 106, RULE_varDecl = 107, RULE_block = 108, RULE_statementList = 109, - RULE_simpleStmt = 110, RULE_expressionStmt = 111, RULE_sendStmt = 112, - RULE_incDecStmt = 113, RULE_assignment = 114, RULE_emptyStmt = 115, RULE_labeledStmt = 116, - RULE_returnStmt = 117, RULE_breakStmt = 118, RULE_continueStmt = 119, - RULE_gotoStmt = 120, RULE_fallthroughStmt = 121, RULE_ifStmt = 122, RULE_switchStmt = 123, - RULE_exprSwitchStmt = 124, RULE_exprCaseClause = 125, RULE_exprSwitchCase = 126, - RULE_typeSwitchStmt = 127, RULE_typeSwitchGuard = 128, RULE_typeCaseClause = 129, - RULE_typeSwitchCase = 130, RULE_typeList = 131, RULE_selectStmt = 132, - RULE_commClause = 133, RULE_commCase = 134, RULE_recvStmt = 135, RULE_forStmt = 136, - RULE_forClause = 137, RULE_rangeClause = 138, RULE_goStmt = 139, RULE_typeName = 140, - RULE_arrayType = 141, RULE_arrayLength = 142, RULE_elementType = 143, - RULE_pointerType = 144, RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, - RULE_functionType = 148, RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, - RULE_conversion = 152, RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, - RULE_integer = 156, RULE_operandName = 157, RULE_qualifiedIdent = 158, - RULE_compositeLit = 159, RULE_literalValue = 160, RULE_elementList = 161, - RULE_keyedElement = 162, RULE_key = 163, RULE_element = 164, RULE_structType = 165, - RULE_fieldDecl = 166, RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, - RULE_typeAssertion = 170, RULE_arguments = 171, RULE_methodExpr = 172, - RULE_receiverType = 173, RULE_eos = 174; + RULE_high = 95, RULE_cap = 96, RULE_assign_op = 97, RULE_rangeClause = 98, + RULE_packageClause = 99, RULE_importPath = 100, RULE_declaration = 101, + RULE_constDecl = 102, RULE_constSpec = 103, RULE_identifierList = 104, + RULE_expressionList = 105, RULE_typeDecl = 106, RULE_typeSpec = 107, RULE_varDecl = 108, + RULE_block = 109, RULE_statementList = 110, RULE_simpleStmt = 111, RULE_expressionStmt = 112, + RULE_sendStmt = 113, RULE_incDecStmt = 114, RULE_assignment = 115, RULE_emptyStmt = 116, + RULE_labeledStmt = 117, RULE_returnStmt = 118, RULE_breakStmt = 119, RULE_continueStmt = 120, + RULE_gotoStmt = 121, RULE_fallthroughStmt = 122, RULE_ifStmt = 123, RULE_switchStmt = 124, + RULE_exprSwitchStmt = 125, RULE_exprCaseClause = 126, RULE_exprSwitchCase = 127, + RULE_typeSwitchStmt = 128, RULE_typeSwitchGuard = 129, RULE_typeCaseClause = 130, + RULE_typeSwitchCase = 131, RULE_typeList = 132, RULE_selectStmt = 133, + RULE_commClause = 134, RULE_commCase = 135, RULE_recvStmt = 136, RULE_forStmt = 137, + RULE_forClause = 138, RULE_goStmt = 139, RULE_typeName = 140, RULE_arrayType = 141, + RULE_arrayLength = 142, RULE_elementType = 143, RULE_pointerType = 144, + RULE_sliceType = 145, RULE_mapType = 146, RULE_channelType = 147, RULE_functionType = 148, + RULE_signature = 149, RULE_result = 150, RULE_parameters = 151, RULE_conversion = 152, + RULE_nonNamedType = 153, RULE_operand = 154, RULE_literal = 155, RULE_integer = 156, + RULE_operandName = 157, RULE_qualifiedIdent = 158, RULE_compositeLit = 159, + RULE_literalValue = 160, RULE_elementList = 161, RULE_keyedElement = 162, + RULE_key = 163, RULE_element = 164, RULE_structType = 165, RULE_fieldDecl = 166, + RULE_string_ = 167, RULE_embeddedField = 168, RULE_index = 169, RULE_typeAssertion = 170, + RULE_arguments = 171, RULE_methodExpr = 172, RULE_receiverType = 173, + RULE_eos = 174; private static String[] makeRuleNames() { return new String[] { "exprOnly", "stmtOnly", "typeOnly", "maybeAddressableIdentifierList", @@ -114,15 +114,15 @@ private static String[] makeRuleNames() { "specForStmt", "loopSpec", "deferStmt", "basicLit", "primaryExpr", "functionLit", "closureDecl", "predConstructArgs", "interfaceType", "predicateSpec", "methodSpec", "type_", "typeLit", "predType", "predTypeParams", "literalType", - "implicitArray", "slice_", "low", "high", "cap", "assign_op", "packageClause", - "importPath", "declaration", "constDecl", "constSpec", "identifierList", - "expressionList", "typeDecl", "typeSpec", "varDecl", "block", "statementList", - "simpleStmt", "expressionStmt", "sendStmt", "incDecStmt", "assignment", - "emptyStmt", "labeledStmt", "returnStmt", "breakStmt", "continueStmt", - "gotoStmt", "fallthroughStmt", "ifStmt", "switchStmt", "exprSwitchStmt", - "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", "typeSwitchGuard", - "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", "commClause", - "commCase", "recvStmt", "forStmt", "forClause", "rangeClause", "goStmt", + "implicitArray", "slice_", "low", "high", "cap", "assign_op", "rangeClause", + "packageClause", "importPath", "declaration", "constDecl", "constSpec", + "identifierList", "expressionList", "typeDecl", "typeSpec", "varDecl", + "block", "statementList", "simpleStmt", "expressionStmt", "sendStmt", + "incDecStmt", "assignment", "emptyStmt", "labeledStmt", "returnStmt", + "breakStmt", "continueStmt", "gotoStmt", "fallthroughStmt", "ifStmt", + "switchStmt", "exprSwitchStmt", "exprCaseClause", "exprSwitchCase", "typeSwitchStmt", + "typeSwitchGuard", "typeCaseClause", "typeSwitchCase", "typeList", "selectStmt", + "commClause", "commCase", "recvStmt", "forStmt", "forClause", "goStmt", "typeName", "arrayType", "arrayLength", "elementType", "pointerType", "sliceType", "mapType", "channelType", "functionType", "signature", "result", "parameters", "conversion", "nonNamedType", "operand", "literal", "integer", @@ -146,15 +146,15 @@ private static String[] makeLiteralNames() { "'some'", "'get'", "'domain'", "'axiom'", "'none'", "'pred'", "'typeOf'", "'isComparable'", "'share'", "'@'", "'..'", "'shared'", "'exclusive'", "'predicate'", "'writePerm'", "'noPerm'", "'trusted'", "'outline'", "'initEnsures'", - "'importRequires'", "'proof'", "'==='", "'!=='", "'break'", "'default'", - "'func'", "'interface'", "'select'", "'case'", "'defer'", "'go'", "'map'", - "'struct'", "'chan'", "'else'", "'goto'", "'package'", "'switch'", "'const'", - "'fallthrough'", "'if'", "'range'", "'type'", "'continue'", "'for'", - "'import'", "'return'", "'var'", "'nil'", null, "'('", "')'", "'{'", - "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "'++'", "'--'", - "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", "'<'", "'<='", "'>'", - "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", "'!'", "'+'", "'-'", - "'^'", "'*'", "'&'", "'<-'" + "'importRequires'", "'proof'", "'==='", "'!=='", "'with'", "'break'", + "'default'", "'func'", "'interface'", "'select'", "'case'", "'defer'", + "'go'", "'map'", "'struct'", "'chan'", "'else'", "'goto'", "'package'", + "'switch'", "'const'", "'fallthrough'", "'if'", "'range'", "'type'", + "'continue'", "'for'", "'import'", "'return'", "'var'", "'nil'", null, + "'('", "')'", "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", + "'.'", "'++'", "'--'", "':='", "'...'", "'||'", "'&&'", "'=='", "'!='", + "'<'", "'<='", "'>'", "'>='", "'|'", "'/'", "'%'", "'<<'", "'>>'", "'&^'", + "'!'", "'+'", "'-'", "'^'", "'*'", "'&'", "'<-'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -169,9 +169,9 @@ private static String[] makeSymbolicNames() { "GET", "DOM", "AXIOM", "NONE", "PRED", "TYPE_OF", "IS_COMPARABLE", "SHARE", "ADDR_MOD", "DOT_DOT", "SHARED", "EXCLUSIVE", "PREDICATE", "WRITEPERM", "NOPERM", "TRUSTED", "OUTLINE", "INIT_POST", "IMPORT_PRE", "PROOF", "GHOST_EQUALS", - "GHOST_NOT_EQUALS", "BREAK", "DEFAULT", "FUNC", "INTERFACE", "SELECT", - "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", "PACKAGE", - "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", + "GHOST_NOT_EQUALS", "WITH", "BREAK", "DEFAULT", "FUNC", "INTERFACE", + "SELECT", "CASE", "DEFER", "GO", "MAP", "STRUCT", "CHAN", "ELSE", "GOTO", + "PACKAGE", "SWITCH", "CONST", "FALLTHROUGH", "IF", "RANGE", "TYPE", "CONTINUE", "FOR", "IMPORT", "RETURN", "VAR", "NIL_LIT", "IDENTIFIER", "L_PAREN", "R_PAREN", "L_CURLY", "R_CURLY", "L_BRACKET", "R_BRACKET", "ASSIGN", "COMMA", "SEMI", "COLON", "DOT", "PLUS_PLUS", "MINUS_MINUS", "DECLARE_ASSIGN", @@ -559,7 +559,7 @@ public final SourceFileContext sourceFile() throws RecognitionException { setState(398); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (CONST - 73)) | (1L << (TYPE - 73)) | (1L << (VAR - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (PRE - 9)) | (1L << (PRESERVES - 9)) | (1L << (POST - 9)) | (1L << (DEC - 9)) | (1L << (PURE - 9)) | (1L << (GHOST - 9)) | (1L << (SEQ - 9)) | (1L << (SET - 9)) | (1L << (MSET - 9)) | (1L << (DICT - 9)) | (1L << (OPT - 9)) | (1L << (DOM - 9)) | (1L << (PRED - 9)) | (1L << (TRUSTED - 9)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (CONST - 74)) | (1L << (TYPE - 74)) | (1L << (VAR - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { { setState(392); @@ -3240,7 +3240,7 @@ public final ClosureSpecInstanceContext closureSpecInstance() throws Recognition setState(720); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(716); closureSpecParams(); @@ -5016,7 +5016,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(901); ((UnaryExprContext)_localctx).unary_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & ((1L << (EXCLAMATION - 127)) | (1L << (PLUS - 127)) | (1L << (MINUS - 127)) | (1L << (CARET - 127)) | (1L << (STAR - 127)) | (1L << (AMPERSAND - 127)) | (1L << (RECEIVE - 127)))) != 0)) ) { + if ( !(((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)))) != 0)) ) { ((UnaryExprContext)_localctx).unary_op = (Token)_errHandler.recoverInline(this); } else { @@ -5101,7 +5101,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(919); ((MulExprContext)_localctx).mul_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) { + if ( !(((((_la - 123)) & ~0x3f) == 0 && ((1L << (_la - 123)) & ((1L << (DIV - 123)) | (1L << (MOD - 123)) | (1L << (LSHIFT - 123)) | (1L << (RSHIFT - 123)) | (1L << (BIT_CLEAR - 123)) | (1L << (STAR - 123)) | (1L << (AMPERSAND - 123)))) != 0)) ) { ((MulExprContext)_localctx).mul_op = (Token)_errHandler.recoverInline(this); } else { @@ -5122,7 +5122,7 @@ private ExpressionContext expression(int _p) throws RecognitionException { setState(922); ((AddExprContext)_localctx).add_op = _input.LT(1); _la = _input.LA(1); - if ( !(_la==WAND || ((((_la - 109)) & ~0x3f) == 0 && ((1L << (_la - 109)) & ((1L << (PLUS_PLUS - 109)) | (1L << (OR - 109)) | (1L << (PLUS - 109)) | (1L << (MINUS - 109)) | (1L << (CARET - 109)))) != 0)) ) { + if ( !(_la==WAND || ((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (PLUS_PLUS - 110)) | (1L << (OR - 110)) | (1L << (PLUS - 110)) | (1L << (MINUS - 110)) | (1L << (CARET - 110)))) != 0)) ) { ((AddExprContext)_localctx).add_op = (Token)_errHandler.recoverInline(this); } else { @@ -6472,7 +6472,7 @@ public final PredConstructArgsContext predConstructArgs() throws RecognitionExce setState(1073); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1072); expressionList(); @@ -7027,7 +7027,7 @@ public final PredTypeParamsContext predTypeParams() throws RecognitionException setState(1152); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { setState(1141); type_(); @@ -7268,7 +7268,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1172); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1171); low(); @@ -7280,7 +7280,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1176); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1175); high(); @@ -7294,7 +7294,7 @@ public final Slice_Context slice_() throws RecognitionException { setState(1179); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { setState(1178); low(); @@ -7470,12 +7470,12 @@ public final Assign_opContext assign_op() throws RecognitionException { setState(1197); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) { + if (((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) { { setState(1196); ((Assign_opContext)_localctx).ass_op = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (OR - 121)) | (1L << (DIV - 121)) | (1L << (MOD - 121)) | (1L << (LSHIFT - 121)) | (1L << (RSHIFT - 121)) | (1L << (BIT_CLEAR - 121)) | (1L << (PLUS - 121)) | (1L << (MINUS - 121)) | (1L << (CARET - 121)) | (1L << (STAR - 121)) | (1L << (AMPERSAND - 121)))) != 0)) ) { + if ( !(((((_la - 122)) & ~0x3f) == 0 && ((1L << (_la - 122)) & ((1L << (OR - 122)) | (1L << (DIV - 122)) | (1L << (MOD - 122)) | (1L << (LSHIFT - 122)) | (1L << (RSHIFT - 122)) | (1L << (BIT_CLEAR - 122)) | (1L << (PLUS - 122)) | (1L << (MINUS - 122)) | (1L << (CARET - 122)) | (1L << (STAR - 122)) | (1L << (AMPERSAND - 122)))) != 0)) ) { ((Assign_opContext)_localctx).ass_op = (Token)_errHandler.recoverInline(this); } else { @@ -7501,6 +7501,96 @@ public final Assign_opContext assign_op() throws RecognitionException { return _localctx; } + public static class RangeClauseContext extends ParserRuleContext { + public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ExpressionListContext expressionList() { + return getRuleContext(ExpressionListContext.class,0); + } + public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } + public MaybeAddressableIdentifierListContext maybeAddressableIdentifierList() { + return getRuleContext(MaybeAddressableIdentifierListContext.class,0); + } + public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); } + public TerminalNode WITH() { return getToken(GobraParser.WITH, 0); } + public TerminalNode IDENTIFIER() { return getToken(GobraParser.IDENTIFIER, 0); } + public RangeClauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_rangeClause; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitRangeClause(this); + else return visitor.visitChildren(this); + } + } + + public final RangeClauseContext rangeClause() throws RecognitionException { + RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); + enterRule(_localctx, 196, RULE_rangeClause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1207); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { + case 1: + { + setState(1201); + expressionList(); + setState(1202); + match(ASSIGN); + } + break; + case 2: + { + setState(1204); + maybeAddressableIdentifierList(); + setState(1205); + match(DECLARE_ASSIGN); + } + break; + } + setState(1209); + match(RANGE); + setState(1210); + expression(0); + setState(1215); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WITH) { + { + setState(1211); + match(WITH); + setState(1213); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IDENTIFIER) { + { + setState(1212); + match(IDENTIFIER); + } + } + + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class PackageClauseContext extends ParserRuleContext { public Token packageName; public TerminalNode PACKAGE() { return getToken(GobraParser.PACKAGE, 0); } @@ -7518,13 +7608,13 @@ public T accept(ParseTreeVisitor visitor) { public final PackageClauseContext packageClause() throws RecognitionException { PackageClauseContext _localctx = new PackageClauseContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_packageClause); + enterRule(_localctx, 198, RULE_packageClause); try { enterOuterAlt(_localctx, 1); { - setState(1201); + setState(1217); match(PACKAGE); - setState(1202); + setState(1218); ((PackageClauseContext)_localctx).packageName = match(IDENTIFIER); } } @@ -7556,11 +7646,11 @@ public T accept(ParseTreeVisitor visitor) { public final ImportPathContext importPath() throws RecognitionException { ImportPathContext _localctx = new ImportPathContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_importPath); + enterRule(_localctx, 200, RULE_importPath); try { enterOuterAlt(_localctx, 1); { - setState(1204); + setState(1220); string_(); } } @@ -7598,29 +7688,29 @@ public T accept(ParseTreeVisitor visitor) { public final DeclarationContext declaration() throws RecognitionException { DeclarationContext _localctx = new DeclarationContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_declaration); + enterRule(_localctx, 202, RULE_declaration); try { - setState(1209); + setState(1225); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: enterOuterAlt(_localctx, 1); { - setState(1206); + setState(1222); constDecl(); } break; case TYPE: enterOuterAlt(_localctx, 2); { - setState(1207); + setState(1223); typeDecl(); } break; case VAR: enterOuterAlt(_localctx, 3); { - setState(1208); + setState(1224); varDecl(); } break; @@ -7668,43 +7758,43 @@ public T accept(ParseTreeVisitor visitor) { public final ConstDeclContext constDecl() throws RecognitionException { ConstDeclContext _localctx = new ConstDeclContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_constDecl); + enterRule(_localctx, 204, RULE_constDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1211); + setState(1227); match(CONST); - setState(1223); + setState(1239); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1212); + setState(1228); constSpec(); } break; case L_PAREN: { - setState(1213); + setState(1229); match(L_PAREN); - setState(1219); + setState(1235); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1214); + setState(1230); constSpec(); - setState(1215); + setState(1231); eos(); } } - setState(1221); + setState(1237); _errHandler.sync(this); _la = _input.LA(1); } - setState(1222); + setState(1238); match(R_PAREN); } break; @@ -7748,31 +7838,31 @@ public T accept(ParseTreeVisitor visitor) { public final ConstSpecContext constSpec() throws RecognitionException { ConstSpecContext _localctx = new ConstSpecContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_constSpec); + enterRule(_localctx, 206, RULE_constSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1225); + setState(1241); identifierList(); - setState(1231); + setState(1247); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { case 1: { - setState(1227); + setState(1243); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { - setState(1226); + setState(1242); type_(); } } - setState(1229); + setState(1245); match(ASSIGN); - setState(1230); + setState(1246); expressionList(); } break; @@ -7812,30 +7902,30 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierListContext identifierList() throws RecognitionException { IdentifierListContext _localctx = new IdentifierListContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_identifierList); + enterRule(_localctx, 208, RULE_identifierList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1233); + setState(1249); match(IDENTIFIER); - setState(1238); + setState(1254); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,107,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1234); + setState(1250); match(COMMA); - setState(1235); + setState(1251); match(IDENTIFIER); } } } - setState(1240); + setState(1256); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,104,_ctx); + _alt = getInterpreter().adaptivePredict(_input,107,_ctx); } } } @@ -7874,30 +7964,30 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionListContext expressionList() throws RecognitionException { ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_expressionList); + enterRule(_localctx, 210, RULE_expressionList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1241); + setState(1257); expression(0); - setState(1246); + setState(1262); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,105,_ctx); + _alt = getInterpreter().adaptivePredict(_input,108,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1242); + setState(1258); match(COMMA); - setState(1243); + setState(1259); expression(0); } } } - setState(1248); + setState(1264); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,105,_ctx); + _alt = getInterpreter().adaptivePredict(_input,108,_ctx); } } } @@ -7941,43 +8031,43 @@ public T accept(ParseTreeVisitor visitor) { public final TypeDeclContext typeDecl() throws RecognitionException { TypeDeclContext _localctx = new TypeDeclContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_typeDecl); + enterRule(_localctx, 212, RULE_typeDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1249); + setState(1265); match(TYPE); - setState(1261); + setState(1277); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1250); + setState(1266); typeSpec(); } break; case L_PAREN: { - setState(1251); + setState(1267); match(L_PAREN); - setState(1257); + setState(1273); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1252); + setState(1268); typeSpec(); - setState(1253); + setState(1269); eos(); } } - setState(1259); + setState(1275); _errHandler.sync(this); _la = _input.LA(1); } - setState(1260); + setState(1276); match(R_PAREN); } break; @@ -8016,24 +8106,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSpecContext typeSpec() throws RecognitionException { TypeSpecContext _localctx = new TypeSpecContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_typeSpec); + enterRule(_localctx, 214, RULE_typeSpec); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1263); + setState(1279); match(IDENTIFIER); - setState(1265); + setState(1281); _errHandler.sync(this); _la = _input.LA(1); if (_la==ASSIGN) { { - setState(1264); + setState(1280); match(ASSIGN); } } - setState(1267); + setState(1283); type_(); } } @@ -8077,43 +8167,43 @@ public T accept(ParseTreeVisitor visitor) { public final VarDeclContext varDecl() throws RecognitionException { VarDeclContext _localctx = new VarDeclContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_varDecl); + enterRule(_localctx, 216, RULE_varDecl); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1269); + setState(1285); match(VAR); - setState(1281); + setState(1297); _errHandler.sync(this); switch (_input.LA(1)) { case IDENTIFIER: { - setState(1270); + setState(1286); varSpec(); } break; case L_PAREN: { - setState(1271); + setState(1287); match(L_PAREN); - setState(1277); + setState(1293); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER) { { { - setState(1272); + setState(1288); varSpec(); - setState(1273); + setState(1289); eos(); } } - setState(1279); + setState(1295); _errHandler.sync(this); _la = _input.LA(1); } - setState(1280); + setState(1296); match(R_PAREN); } break; @@ -8152,23 +8242,23 @@ public T accept(ParseTreeVisitor visitor) { public final BlockContext block() throws RecognitionException { BlockContext _localctx = new BlockContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_block); + enterRule(_localctx, 218, RULE_block); try { enterOuterAlt(_localctx, 1); { - setState(1283); + setState(1299); match(L_CURLY); - setState(1285); + setState(1301); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,111,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { case 1: { - setState(1284); + setState(1300); statementList(); } break; } - setState(1287); + setState(1303); match(R_CURLY); } } @@ -8209,12 +8299,12 @@ public T accept(ParseTreeVisitor visitor) { public final StatementListContext statementList() throws RecognitionException { StatementListContext _localctx = new StatementListContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_statementList); + enterRule(_localctx, 220, RULE_statementList); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1295); + setState(1311); _errHandler.sync(this); _alt = 1; do { @@ -8222,19 +8312,19 @@ public final StatementListContext statementList() throws RecognitionException { case 1: { { - setState(1290); + setState(1306); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { case 1: { - setState(1289); + setState(1305); eos(); } break; } - setState(1292); + setState(1308); statement(); - setState(1293); + setState(1309); eos(); } } @@ -8242,9 +8332,9 @@ public final StatementListContext statementList() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1297); + setState(1313); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,113,_ctx); + _alt = getInterpreter().adaptivePredict(_input,116,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } } @@ -8288,43 +8378,43 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleStmtContext simpleStmt() throws RecognitionException { SimpleStmtContext _localctx = new SimpleStmtContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_simpleStmt); + enterRule(_localctx, 222, RULE_simpleStmt); try { - setState(1304); + setState(1320); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1299); + setState(1315); sendStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1300); + setState(1316); incDecStmt(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1301); + setState(1317); assignment(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1302); + setState(1318); expressionStmt(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(1303); + setState(1319); shortVarDecl(); } break; @@ -8358,11 +8448,11 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionStmtContext expressionStmt() throws RecognitionException { ExpressionStmtContext _localctx = new ExpressionStmtContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_expressionStmt); + enterRule(_localctx, 224, RULE_expressionStmt); try { enterOuterAlt(_localctx, 1); { - setState(1306); + setState(1322); expression(0); } } @@ -8399,15 +8489,15 @@ public T accept(ParseTreeVisitor visitor) { public final SendStmtContext sendStmt() throws RecognitionException { SendStmtContext _localctx = new SendStmtContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_sendStmt); + enterRule(_localctx, 226, RULE_sendStmt); try { enterOuterAlt(_localctx, 1); { - setState(1308); + setState(1324); ((SendStmtContext)_localctx).channel = expression(0); - setState(1309); + setState(1325); match(RECEIVE); - setState(1310); + setState(1326); expression(0); } } @@ -8441,14 +8531,14 @@ public T accept(ParseTreeVisitor visitor) { public final IncDecStmtContext incDecStmt() throws RecognitionException { IncDecStmtContext _localctx = new IncDecStmtContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_incDecStmt); + enterRule(_localctx, 228, RULE_incDecStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1312); + setState(1328); expression(0); - setState(1313); + setState(1329); _la = _input.LA(1); if ( !(_la==PLUS_PLUS || _la==MINUS_MINUS) ) { _errHandler.recoverInline(this); @@ -8494,15 +8584,15 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 228, RULE_assignment); + enterRule(_localctx, 230, RULE_assignment); try { enterOuterAlt(_localctx, 1); { - setState(1315); + setState(1331); expressionList(); - setState(1316); + setState(1332); assign_op(); - setState(1317); + setState(1333); expressionList(); } } @@ -8533,12 +8623,12 @@ public T accept(ParseTreeVisitor visitor) { public final EmptyStmtContext emptyStmt() throws RecognitionException { EmptyStmtContext _localctx = new EmptyStmtContext(_ctx, getState()); - enterRule(_localctx, 230, RULE_emptyStmt); + enterRule(_localctx, 232, RULE_emptyStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1319); + setState(1335); _la = _input.LA(1); if ( !(_la==SEMI || _la==EOS) ) { _errHandler.recoverInline(this); @@ -8580,20 +8670,20 @@ public T accept(ParseTreeVisitor visitor) { public final LabeledStmtContext labeledStmt() throws RecognitionException { LabeledStmtContext _localctx = new LabeledStmtContext(_ctx, getState()); - enterRule(_localctx, 232, RULE_labeledStmt); + enterRule(_localctx, 234, RULE_labeledStmt); try { enterOuterAlt(_localctx, 1); { - setState(1321); + setState(1337); match(IDENTIFIER); - setState(1322); + setState(1338); match(COLON); - setState(1324); + setState(1340); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { case 1: { - setState(1323); + setState(1339); statement(); } break; @@ -8629,18 +8719,18 @@ public T accept(ParseTreeVisitor visitor) { public final ReturnStmtContext returnStmt() throws RecognitionException { ReturnStmtContext _localctx = new ReturnStmtContext(_ctx, getState()); - enterRule(_localctx, 234, RULE_returnStmt); + enterRule(_localctx, 236, RULE_returnStmt); try { enterOuterAlt(_localctx, 1); { - setState(1326); + setState(1342); match(RETURN); - setState(1328); + setState(1344); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { case 1: { - setState(1327); + setState(1343); expressionList(); } break; @@ -8674,18 +8764,18 @@ public T accept(ParseTreeVisitor visitor) { public final BreakStmtContext breakStmt() throws RecognitionException { BreakStmtContext _localctx = new BreakStmtContext(_ctx, getState()); - enterRule(_localctx, 236, RULE_breakStmt); + enterRule(_localctx, 238, RULE_breakStmt); try { enterOuterAlt(_localctx, 1); { - setState(1330); + setState(1346); match(BREAK); - setState(1332); + setState(1348); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) { case 1: { - setState(1331); + setState(1347); match(IDENTIFIER); } break; @@ -8719,18 +8809,18 @@ public T accept(ParseTreeVisitor visitor) { public final ContinueStmtContext continueStmt() throws RecognitionException { ContinueStmtContext _localctx = new ContinueStmtContext(_ctx, getState()); - enterRule(_localctx, 238, RULE_continueStmt); + enterRule(_localctx, 240, RULE_continueStmt); try { enterOuterAlt(_localctx, 1); { - setState(1334); + setState(1350); match(CONTINUE); - setState(1336); + setState(1352); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,118,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { case 1: { - setState(1335); + setState(1351); match(IDENTIFIER); } break; @@ -8764,13 +8854,13 @@ public T accept(ParseTreeVisitor visitor) { public final GotoStmtContext gotoStmt() throws RecognitionException { GotoStmtContext _localctx = new GotoStmtContext(_ctx, getState()); - enterRule(_localctx, 240, RULE_gotoStmt); + enterRule(_localctx, 242, RULE_gotoStmt); try { enterOuterAlt(_localctx, 1); { - setState(1338); + setState(1354); match(GOTO); - setState(1339); + setState(1355); match(IDENTIFIER); } } @@ -8800,11 +8890,11 @@ public T accept(ParseTreeVisitor visitor) { public final FallthroughStmtContext fallthroughStmt() throws RecognitionException { FallthroughStmtContext _localctx = new FallthroughStmtContext(_ctx, getState()); - enterRule(_localctx, 242, RULE_fallthroughStmt); + enterRule(_localctx, 244, RULE_fallthroughStmt); try { enterOuterAlt(_localctx, 1); { - setState(1341); + setState(1357); match(FALLTHROUGH); } } @@ -8853,61 +8943,61 @@ public T accept(ParseTreeVisitor visitor) { public final IfStmtContext ifStmt() throws RecognitionException { IfStmtContext _localctx = new IfStmtContext(_ctx, getState()); - enterRule(_localctx, 244, RULE_ifStmt); + enterRule(_localctx, 246, RULE_ifStmt); try { enterOuterAlt(_localctx, 1); { - setState(1343); + setState(1359); match(IF); - setState(1352); + setState(1368); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,119,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { case 1: { - setState(1344); + setState(1360); expression(0); } break; case 2: { - setState(1345); + setState(1361); eos(); - setState(1346); + setState(1362); expression(0); } break; case 3: { - setState(1348); + setState(1364); simpleStmt(); - setState(1349); + setState(1365); eos(); - setState(1350); + setState(1366); expression(0); } break; } - setState(1354); + setState(1370); block(); - setState(1360); + setState(1376); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { case 1: { - setState(1355); + setState(1371); match(ELSE); - setState(1358); + setState(1374); _errHandler.sync(this); switch (_input.LA(1)) { case IF: { - setState(1356); + setState(1372); ifStmt(); } break; case L_CURLY: { - setState(1357); + setState(1373); block(); } break; @@ -8950,22 +9040,22 @@ public T accept(ParseTreeVisitor visitor) { public final SwitchStmtContext switchStmt() throws RecognitionException { SwitchStmtContext _localctx = new SwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 246, RULE_switchStmt); + enterRule(_localctx, 248, RULE_switchStmt); try { - setState(1364); + setState(1380); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1362); + setState(1378); exprSwitchStmt(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1363); + setState(1379); typeSwitchStmt(); } break; @@ -9014,24 +9104,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException { ExprSwitchStmtContext _localctx = new ExprSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 248, RULE_exprSwitchStmt); + enterRule(_localctx, 250, RULE_exprSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1366); + setState(1382); match(SWITCH); - setState(1377); + setState(1393); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) { case 1: { - setState(1368); + setState(1384); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1367); + setState(1383); expression(0); } } @@ -9040,24 +9130,24 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException break; case 2: { - setState(1371); + setState(1387); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,124,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) { case 1: { - setState(1370); + setState(1386); simpleStmt(); } break; } - setState(1373); + setState(1389); eos(); - setState(1375); + setState(1391); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1374); + setState(1390); expression(0); } } @@ -9065,23 +9155,23 @@ public final ExprSwitchStmtContext exprSwitchStmt() throws RecognitionException } break; } - setState(1379); + setState(1395); match(L_CURLY); - setState(1383); + setState(1399); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1380); + setState(1396); exprCaseClause(); } } - setState(1385); + setState(1401); _errHandler.sync(this); _la = _input.LA(1); } - setState(1386); + setState(1402); match(R_CURLY); } } @@ -9117,20 +9207,20 @@ public T accept(ParseTreeVisitor visitor) { public final ExprCaseClauseContext exprCaseClause() throws RecognitionException { ExprCaseClauseContext _localctx = new ExprCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 250, RULE_exprCaseClause); + enterRule(_localctx, 252, RULE_exprCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1388); + setState(1404); exprSwitchCase(); - setState(1389); + setState(1405); match(COLON); - setState(1391); + setState(1407); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,128,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { case 1: { - setState(1390); + setState(1406); statementList(); } break; @@ -9167,24 +9257,24 @@ public T accept(ParseTreeVisitor visitor) { public final ExprSwitchCaseContext exprSwitchCase() throws RecognitionException { ExprSwitchCaseContext _localctx = new ExprSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 252, RULE_exprSwitchCase); + enterRule(_localctx, 254, RULE_exprSwitchCase); try { - setState(1396); + setState(1412); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1393); + setState(1409); match(CASE); - setState(1394); + setState(1410); expressionList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1395); + setState(1411); match(DEFAULT); } break; @@ -9235,58 +9325,58 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchStmtContext typeSwitchStmt() throws RecognitionException { TypeSwitchStmtContext _localctx = new TypeSwitchStmtContext(_ctx, getState()); - enterRule(_localctx, 254, RULE_typeSwitchStmt); + enterRule(_localctx, 256, RULE_typeSwitchStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1398); + setState(1414); match(SWITCH); - setState(1407); + setState(1423); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { case 1: { - setState(1399); + setState(1415); typeSwitchGuard(); } break; case 2: { - setState(1400); + setState(1416); eos(); - setState(1401); + setState(1417); typeSwitchGuard(); } break; case 3: { - setState(1403); + setState(1419); simpleStmt(); - setState(1404); + setState(1420); eos(); - setState(1405); + setState(1421); typeSwitchGuard(); } break; } - setState(1409); + setState(1425); match(L_CURLY); - setState(1413); + setState(1429); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1410); + setState(1426); typeCaseClause(); } } - setState(1415); + setState(1431); _errHandler.sync(this); _la = _input.LA(1); } - setState(1416); + setState(1432); match(R_CURLY); } } @@ -9324,31 +9414,31 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchGuardContext typeSwitchGuard() throws RecognitionException { TypeSwitchGuardContext _localctx = new TypeSwitchGuardContext(_ctx, getState()); - enterRule(_localctx, 256, RULE_typeSwitchGuard); + enterRule(_localctx, 258, RULE_typeSwitchGuard); try { enterOuterAlt(_localctx, 1); { - setState(1420); + setState(1436); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,132,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,135,_ctx) ) { case 1: { - setState(1418); + setState(1434); match(IDENTIFIER); - setState(1419); + setState(1435); match(DECLARE_ASSIGN); } break; } - setState(1422); + setState(1438); primaryExpr(0); - setState(1423); + setState(1439); match(DOT); - setState(1424); + setState(1440); match(L_PAREN); - setState(1425); + setState(1441); match(TYPE); - setState(1426); + setState(1442); match(R_PAREN); } } @@ -9384,20 +9474,20 @@ public T accept(ParseTreeVisitor visitor) { public final TypeCaseClauseContext typeCaseClause() throws RecognitionException { TypeCaseClauseContext _localctx = new TypeCaseClauseContext(_ctx, getState()); - enterRule(_localctx, 258, RULE_typeCaseClause); + enterRule(_localctx, 260, RULE_typeCaseClause); try { enterOuterAlt(_localctx, 1); { - setState(1428); + setState(1444); typeSwitchCase(); - setState(1429); + setState(1445); match(COLON); - setState(1431); + setState(1447); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,133,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,136,_ctx) ) { case 1: { - setState(1430); + setState(1446); statementList(); } break; @@ -9434,24 +9524,24 @@ public T accept(ParseTreeVisitor visitor) { public final TypeSwitchCaseContext typeSwitchCase() throws RecognitionException { TypeSwitchCaseContext _localctx = new TypeSwitchCaseContext(_ctx, getState()); - enterRule(_localctx, 260, RULE_typeSwitchCase); + enterRule(_localctx, 262, RULE_typeSwitchCase); try { - setState(1436); + setState(1452); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1433); + setState(1449); match(CASE); - setState(1434); + setState(1450); typeList(); } break; case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1435); + setState(1451); match(DEFAULT); } break; @@ -9498,12 +9588,12 @@ public T accept(ParseTreeVisitor visitor) { public final TypeListContext typeList() throws RecognitionException { TypeListContext _localctx = new TypeListContext(_ctx, getState()); - enterRule(_localctx, 262, RULE_typeList); + enterRule(_localctx, 264, RULE_typeList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1440); + setState(1456); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9525,28 +9615,28 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1438); + setState(1454); type_(); } break; case NIL_LIT: { - setState(1439); + setState(1455); match(NIL_LIT); } break; default: throw new NoViableAltException(this); } - setState(1449); + setState(1465); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(1442); + setState(1458); match(COMMA); - setState(1445); + setState(1461); _errHandler.sync(this); switch (_input.LA(1)) { case GHOST: @@ -9568,13 +9658,13 @@ public final TypeListContext typeList() throws RecognitionException { case STAR: case RECEIVE: { - setState(1443); + setState(1459); type_(); } break; case NIL_LIT: { - setState(1444); + setState(1460); match(NIL_LIT); } break; @@ -9583,7 +9673,7 @@ public final TypeListContext typeList() throws RecognitionException { } } } - setState(1451); + setState(1467); _errHandler.sync(this); _la = _input.LA(1); } @@ -9623,30 +9713,30 @@ public T accept(ParseTreeVisitor visitor) { public final SelectStmtContext selectStmt() throws RecognitionException { SelectStmtContext _localctx = new SelectStmtContext(_ctx, getState()); - enterRule(_localctx, 264, RULE_selectStmt); + enterRule(_localctx, 266, RULE_selectStmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1452); + setState(1468); match(SELECT); - setState(1453); + setState(1469); match(L_CURLY); - setState(1457); + setState(1473); _errHandler.sync(this); _la = _input.LA(1); while (_la==DEFAULT || _la==CASE) { { { - setState(1454); + setState(1470); commClause(); } } - setState(1459); + setState(1475); _errHandler.sync(this); _la = _input.LA(1); } - setState(1460); + setState(1476); match(R_CURLY); } } @@ -9682,20 +9772,20 @@ public T accept(ParseTreeVisitor visitor) { public final CommClauseContext commClause() throws RecognitionException { CommClauseContext _localctx = new CommClauseContext(_ctx, getState()); - enterRule(_localctx, 266, RULE_commClause); + enterRule(_localctx, 268, RULE_commClause); try { enterOuterAlt(_localctx, 1); { - setState(1462); + setState(1478); commCase(); - setState(1463); + setState(1479); match(COLON); - setState(1465); + setState(1481); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,139,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { case 1: { - setState(1464); + setState(1480); statementList(); } break; @@ -9735,28 +9825,28 @@ public T accept(ParseTreeVisitor visitor) { public final CommCaseContext commCase() throws RecognitionException { CommCaseContext _localctx = new CommCaseContext(_ctx, getState()); - enterRule(_localctx, 268, RULE_commCase); + enterRule(_localctx, 270, RULE_commCase); try { - setState(1473); + setState(1489); _errHandler.sync(this); switch (_input.LA(1)) { case CASE: enterOuterAlt(_localctx, 1); { - setState(1467); + setState(1483); match(CASE); - setState(1470); + setState(1486); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,140,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { case 1: { - setState(1468); + setState(1484); sendStmt(); } break; case 2: { - setState(1469); + setState(1485); recvStmt(); } break; @@ -9766,7 +9856,7 @@ public final CommCaseContext commCase() throws RecognitionException { case DEFAULT: enterOuterAlt(_localctx, 2); { - setState(1472); + setState(1488); match(DEFAULT); } break; @@ -9811,31 +9901,31 @@ public T accept(ParseTreeVisitor visitor) { public final RecvStmtContext recvStmt() throws RecognitionException { RecvStmtContext _localctx = new RecvStmtContext(_ctx, getState()); - enterRule(_localctx, 270, RULE_recvStmt); + enterRule(_localctx, 272, RULE_recvStmt); try { enterOuterAlt(_localctx, 1); { - setState(1481); + setState(1497); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,142,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { case 1: { - setState(1475); + setState(1491); expressionList(); - setState(1476); + setState(1492); match(ASSIGN); } break; case 2: { - setState(1478); + setState(1494); identifierList(); - setState(1479); + setState(1495); match(DECLARE_ASSIGN); } break; } - setState(1483); + setState(1499); ((RecvStmtContext)_localctx).recvExpr = expression(0); } } @@ -9877,35 +9967,35 @@ public T accept(ParseTreeVisitor visitor) { public final ForStmtContext forStmt() throws RecognitionException { ForStmtContext _localctx = new ForStmtContext(_ctx, getState()); - enterRule(_localctx, 272, RULE_forStmt); + enterRule(_localctx, 274, RULE_forStmt); try { enterOuterAlt(_localctx, 1); { - setState(1485); + setState(1501); match(FOR); - setState(1489); + setState(1505); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,146,_ctx) ) { case 1: { - setState(1486); + setState(1502); expression(0); } break; case 2: { - setState(1487); + setState(1503); forClause(); } break; case 3: { - setState(1488); + setState(1504); rangeClause(); } break; } - setState(1491); + setState(1507); block(); } } @@ -9951,41 +10041,41 @@ public T accept(ParseTreeVisitor visitor) { public final ForClauseContext forClause() throws RecognitionException { ForClauseContext _localctx = new ForClauseContext(_ctx, getState()); - enterRule(_localctx, 274, RULE_forClause); + enterRule(_localctx, 276, RULE_forClause); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1494); + setState(1510); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,144,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { case 1: { - setState(1493); + setState(1509); ((ForClauseContext)_localctx).initStmt = simpleStmt(); } break; } - setState(1496); + setState(1512); eos(); - setState(1498); + setState(1514); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { case 1: { - setState(1497); + setState(1513); expression(0); } break; } - setState(1500); + setState(1516); eos(); - setState(1502); + setState(1518); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1501); + setState(1517); ((ForClauseContext)_localctx).postStmt = simpleStmt(); } } @@ -10003,73 +10093,6 @@ public final ForClauseContext forClause() throws RecognitionException { return _localctx; } - public static class RangeClauseContext extends ParserRuleContext { - public TerminalNode RANGE() { return getToken(GobraParser.RANGE, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public ExpressionListContext expressionList() { - return getRuleContext(ExpressionListContext.class,0); - } - public TerminalNode ASSIGN() { return getToken(GobraParser.ASSIGN, 0); } - public IdentifierListContext identifierList() { - return getRuleContext(IdentifierListContext.class,0); - } - public TerminalNode DECLARE_ASSIGN() { return getToken(GobraParser.DECLARE_ASSIGN, 0); } - public RangeClauseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_rangeClause; } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof GobraParserVisitor ) return ((GobraParserVisitor)visitor).visitRangeClause(this); - else return visitor.visitChildren(this); - } - } - - public final RangeClauseContext rangeClause() throws RecognitionException { - RangeClauseContext _localctx = new RangeClauseContext(_ctx, getState()); - enterRule(_localctx, 276, RULE_rangeClause); - try { - enterOuterAlt(_localctx, 1); - { - setState(1510); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,147,_ctx) ) { - case 1: - { - setState(1504); - expressionList(); - setState(1505); - match(ASSIGN); - } - break; - case 2: - { - setState(1507); - identifierList(); - setState(1508); - match(DECLARE_ASSIGN); - } - break; - } - setState(1512); - match(RANGE); - setState(1513); - expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - public static class GoStmtContext extends ParserRuleContext { public TerminalNode GO() { return getToken(GobraParser.GO, 0); } public ExpressionContext expression() { @@ -10092,9 +10115,9 @@ public final GoStmtContext goStmt() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1515); + setState(1520); match(GO); - setState(1516); + setState(1521); expression(0); } } @@ -10129,20 +10152,20 @@ public final TypeNameContext typeName() throws RecognitionException { TypeNameContext _localctx = new TypeNameContext(_ctx, getState()); enterRule(_localctx, 280, RULE_typeName); try { - setState(1520); + setState(1525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1518); + setState(1523); qualifiedIdent(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1519); + setState(1524); match(IDENTIFIER); } break; @@ -10185,13 +10208,13 @@ public final ArrayTypeContext arrayType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1522); + setState(1527); match(L_BRACKET); - setState(1523); + setState(1528); arrayLength(); - setState(1524); + setState(1529); match(R_BRACKET); - setState(1525); + setState(1530); elementType(); } } @@ -10227,7 +10250,7 @@ public final ArrayLengthContext arrayLength() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1527); + setState(1532); expression(0); } } @@ -10263,7 +10286,7 @@ public final ElementTypeContext elementType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1529); + setState(1534); type_(); } } @@ -10300,9 +10323,9 @@ public final PointerTypeContext pointerType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1531); + setState(1536); match(STAR); - setState(1532); + setState(1537); type_(); } } @@ -10340,11 +10363,11 @@ public final SliceTypeContext sliceType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1534); + setState(1539); match(L_BRACKET); - setState(1535); + setState(1540); match(R_BRACKET); - setState(1536); + setState(1541); elementType(); } } @@ -10386,15 +10409,15 @@ public final MapTypeContext mapType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1538); + setState(1543); match(MAP); - setState(1539); + setState(1544); match(L_BRACKET); - setState(1540); + setState(1545); type_(); - setState(1541); + setState(1546); match(R_BRACKET); - setState(1542); + setState(1547); elementType(); } } @@ -10432,33 +10455,33 @@ public final ChannelTypeContext channelType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1549); + setState(1554); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { case 1: { - setState(1544); + setState(1549); match(CHAN); } break; case 2: { - setState(1545); + setState(1550); match(CHAN); - setState(1546); + setState(1551); match(RECEIVE); } break; case 3: { - setState(1547); + setState(1552); match(RECEIVE); - setState(1548); + setState(1553); match(CHAN); } break; } - setState(1551); + setState(1556); elementType(); } } @@ -10495,9 +10518,9 @@ public final FunctionTypeContext functionType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1553); + setState(1558); match(FUNC); - setState(1554); + setState(1559); signature(); } } @@ -10534,22 +10557,22 @@ public final SignatureContext signature() throws RecognitionException { SignatureContext _localctx = new SignatureContext(_ctx, getState()); enterRule(_localctx, 298, RULE_signature); try { - setState(1560); + setState(1565); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,150,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,152,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1556); + setState(1561); parameters(); - setState(1557); + setState(1562); result(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1559); + setState(1564); parameters(); } break; @@ -10588,20 +10611,20 @@ public final ResultContext result() throws RecognitionException { ResultContext _localctx = new ResultContext(_ctx, getState()); enterRule(_localctx, 300, RULE_result); try { - setState(1564); + setState(1569); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,151,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,153,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1562); + setState(1567); parameters(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1563); + setState(1568); type_(); } break; @@ -10650,39 +10673,39 @@ public final ParametersContext parameters() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1566); + setState(1571); match(L_PAREN); - setState(1578); + setState(1583); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (FUNC - 73)) | (1L << (INTERFACE - 73)) | (1L << (MAP - 73)) | (1L << (STRUCT - 73)) | (1L << (CHAN - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (L_PAREN - 73)) | (1L << (L_BRACKET - 73)) | (1L << (ELLIPSIS - 73)) | (1L << (STAR - 73)) | (1L << (RECEIVE - 73)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << DOM) | (1L << PRED))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (FUNC - 74)) | (1L << (INTERFACE - 74)) | (1L << (MAP - 74)) | (1L << (STRUCT - 74)) | (1L << (CHAN - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (L_PAREN - 74)) | (1L << (L_BRACKET - 74)) | (1L << (ELLIPSIS - 74)) | (1L << (STAR - 74)) | (1L << (RECEIVE - 74)))) != 0)) { { - setState(1567); - parameterDecl(); setState(1572); + parameterDecl(); + setState(1577); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,152,_ctx); + _alt = getInterpreter().adaptivePredict(_input,154,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1568); + setState(1573); match(COMMA); - setState(1569); + setState(1574); parameterDecl(); } } } - setState(1574); + setState(1579); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,152,_ctx); + _alt = getInterpreter().adaptivePredict(_input,154,_ctx); } - setState(1576); + setState(1581); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1575); + setState(1580); match(COMMA); } } @@ -10690,7 +10713,7 @@ public final ParametersContext parameters() throws RecognitionException { } } - setState(1580); + setState(1585); match(R_PAREN); } } @@ -10733,23 +10756,23 @@ public final ConversionContext conversion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1582); + setState(1587); nonNamedType(); - setState(1583); + setState(1588); match(L_PAREN); - setState(1584); + setState(1589); expression(0); - setState(1586); + setState(1591); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1585); + setState(1590); match(COMMA); } } - setState(1588); + setState(1593); match(R_PAREN); } } @@ -10788,7 +10811,7 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { NonNamedTypeContext _localctx = new NonNamedTypeContext(_ctx, getState()); enterRule(_localctx, 306, RULE_nonNamedType); try { - setState(1595); + setState(1600); _errHandler.sync(this); switch (_input.LA(1)) { case PRED: @@ -10802,18 +10825,18 @@ public final NonNamedTypeContext nonNamedType() throws RecognitionException { case RECEIVE: enterOuterAlt(_localctx, 1); { - setState(1590); + setState(1595); typeLit(); } break; case L_PAREN: enterOuterAlt(_localctx, 2); { - setState(1591); + setState(1596); match(L_PAREN); - setState(1592); + setState(1597); nonNamedType(); - setState(1593); + setState(1598); match(R_PAREN); } break; @@ -10859,31 +10882,31 @@ public final OperandContext operand() throws RecognitionException { OperandContext _localctx = new OperandContext(_ctx, getState()); enterRule(_localctx, 308, RULE_operand); try { - setState(1603); + setState(1608); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,157,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,159,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1597); + setState(1602); literal(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1598); + setState(1603); operandName(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1599); + setState(1604); match(L_PAREN); - setState(1600); + setState(1605); expression(0); - setState(1601); + setState(1606); match(R_PAREN); } break; @@ -10925,7 +10948,7 @@ public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); enterRule(_localctx, 310, RULE_literal); try { - setState(1608); + setState(1613); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -10942,7 +10965,7 @@ public final LiteralContext literal() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1605); + setState(1610); basicLit(); } break; @@ -10959,7 +10982,7 @@ public final LiteralContext literal() throws RecognitionException { case L_BRACKET: enterOuterAlt(_localctx, 2); { - setState(1606); + setState(1611); compositeLit(); } break; @@ -10972,7 +10995,7 @@ public final LiteralContext literal() throws RecognitionException { case FUNC: enterOuterAlt(_localctx, 3); { - setState(1607); + setState(1612); functionLit(); } break; @@ -11016,9 +11039,9 @@ public final IntegerContext integer() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1610); + setState(1615); _la = _input.LA(1); - if ( !(((((_la - 134)) & ~0x3f) == 0 && ((1L << (_la - 134)) & ((1L << (DECIMAL_LIT - 134)) | (1L << (BINARY_LIT - 134)) | (1L << (OCTAL_LIT - 134)) | (1L << (HEX_LIT - 134)) | (1L << (IMAGINARY_LIT - 134)) | (1L << (RUNE_LIT - 134)))) != 0)) ) { + if ( !(((((_la - 135)) & ~0x3f) == 0 && ((1L << (_la - 135)) & ((1L << (DECIMAL_LIT - 135)) | (1L << (BINARY_LIT - 135)) | (1L << (OCTAL_LIT - 135)) | (1L << (HEX_LIT - 135)) | (1L << (IMAGINARY_LIT - 135)) | (1L << (RUNE_LIT - 135)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -11058,7 +11081,7 @@ public final OperandNameContext operandName() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1612); + setState(1617); match(IDENTIFIER); } } @@ -11096,11 +11119,11 @@ public final QualifiedIdentContext qualifiedIdent() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(1614); + setState(1619); match(IDENTIFIER); - setState(1615); + setState(1620); match(DOT); - setState(1616); + setState(1621); match(IDENTIFIER); } } @@ -11139,9 +11162,9 @@ public final CompositeLitContext compositeLit() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1618); + setState(1623); literalType(); - setState(1619); + setState(1624); literalValue(); } } @@ -11181,21 +11204,21 @@ public final LiteralValueContext literalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1621); - match(L_CURLY); setState(1626); + match(L_CURLY); + setState(1631); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_CURLY - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1622); + setState(1627); elementList(); - setState(1624); + setState(1629); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1623); + setState(1628); match(COMMA); } } @@ -11203,7 +11226,7 @@ public final LiteralValueContext literalValue() throws RecognitionException { } } - setState(1628); + setState(1633); match(R_CURLY); } } @@ -11247,25 +11270,25 @@ public final ElementListContext elementList() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(1630); - keyedElement(); setState(1635); + keyedElement(); + setState(1640); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,161,_ctx); + _alt = getInterpreter().adaptivePredict(_input,163,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1631); + setState(1636); match(COMMA); - setState(1632); + setState(1637); keyedElement(); } } } - setState(1637); + setState(1642); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,161,_ctx); + _alt = getInterpreter().adaptivePredict(_input,163,_ctx); } } } @@ -11305,19 +11328,19 @@ public final KeyedElementContext keyedElement() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1641); + setState(1646); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,164,_ctx) ) { case 1: { - setState(1638); + setState(1643); key(); - setState(1639); + setState(1644); match(COLON); } break; } - setState(1643); + setState(1648); element(); } } @@ -11354,7 +11377,7 @@ public final KeyContext key() throws RecognitionException { KeyContext _localctx = new KeyContext(_ctx, getState()); enterRule(_localctx, 326, RULE_key); try { - setState(1647); + setState(1652); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11419,14 +11442,14 @@ public final KeyContext key() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1645); + setState(1650); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1646); + setState(1651); literalValue(); } break; @@ -11467,7 +11490,7 @@ public final ElementContext element() throws RecognitionException { ElementContext _localctx = new ElementContext(_ctx, getState()); enterRule(_localctx, 328, RULE_element); try { - setState(1651); + setState(1656); _errHandler.sync(this); switch (_input.LA(1)) { case FLOAT_LIT: @@ -11532,14 +11555,14 @@ public final ElementContext element() throws RecognitionException { case INTERPRETED_STRING_LIT: enterOuterAlt(_localctx, 1); { - setState(1649); + setState(1654); expression(0); } break; case L_CURLY: enterOuterAlt(_localctx, 2); { - setState(1650); + setState(1655); literalValue(); } break; @@ -11592,27 +11615,27 @@ public final StructTypeContext structType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1653); + setState(1658); match(STRUCT); - setState(1654); + setState(1659); match(L_CURLY); - setState(1660); + setState(1665); _errHandler.sync(this); _la = _input.LA(1); while (_la==IDENTIFIER || _la==STAR) { { { - setState(1655); + setState(1660); fieldDecl(); - setState(1656); + setState(1661); eos(); } } - setState(1662); + setState(1667); _errHandler.sync(this); _la = _input.LA(1); } - setState(1663); + setState(1668); match(R_CURLY); } } @@ -11658,30 +11681,30 @@ public final FieldDeclContext fieldDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1669); + setState(1674); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,168,_ctx) ) { case 1: { - setState(1665); + setState(1670); identifierList(); - setState(1666); + setState(1671); type_(); } break; case 2: { - setState(1668); + setState(1673); embeddedField(); } break; } - setState(1672); + setState(1677); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,167,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { case 1: { - setState(1671); + setState(1676); ((FieldDeclContext)_localctx).tag = string_(); } break; @@ -11720,7 +11743,7 @@ public final String_Context string_() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1674); + setState(1679); _la = _input.LA(1); if ( !(_la==RAW_STRING_LIT || _la==INTERPRETED_STRING_LIT) ) { _errHandler.recoverInline(this); @@ -11766,17 +11789,17 @@ public final EmbeddedFieldContext embeddedField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1677); + setState(1682); _errHandler.sync(this); _la = _input.LA(1); if (_la==STAR) { { - setState(1676); + setState(1681); match(STAR); } } - setState(1679); + setState(1684); typeName(); } } @@ -11814,11 +11837,11 @@ public final IndexContext index() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1681); + setState(1686); match(L_BRACKET); - setState(1682); + setState(1687); expression(0); - setState(1683); + setState(1688); match(R_BRACKET); } } @@ -11857,13 +11880,13 @@ public final TypeAssertionContext typeAssertion() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1685); + setState(1690); match(DOT); - setState(1686); + setState(1691); match(L_PAREN); - setState(1687); + setState(1692); type_(); - setState(1688); + setState(1693); match(R_PAREN); } } @@ -11910,34 +11933,34 @@ public final ArgumentsContext arguments() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1690); + setState(1695); match(L_PAREN); - setState(1705); + setState(1710); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)) | (1L << (EXCLAMATION - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << FLOAT_LIT) | (1L << TRUE) | (1L << FALSE) | (1L << PRE) | (1L << PRESERVES) | (1L << POST) | (1L << DEC) | (1L << PURE) | (1L << OLD) | (1L << BEFORE) | (1L << FORALL) | (1L << EXISTS) | (1L << ACCESS) | (1L << UNFOLDING) | (1L << GHOST) | (1L << SEQ) | (1L << SET) | (1L << MSET) | (1L << DICT) | (1L << OPT) | (1L << LEN) | (1L << NEW) | (1L << MAKE) | (1L << CAP) | (1L << SOME) | (1L << GET) | (1L << DOM) | (1L << NONE) | (1L << PRED) | (1L << TYPE_OF) | (1L << IS_COMPARABLE) | (1L << WRITEPERM) | (1L << NOPERM))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (TRUSTED - 64)) | (1L << (FUNC - 64)) | (1L << (INTERFACE - 64)) | (1L << (MAP - 64)) | (1L << (STRUCT - 64)) | (1L << (CHAN - 64)) | (1L << (RANGE - 64)) | (1L << (TYPE - 64)) | (1L << (NIL_LIT - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (L_PAREN - 64)) | (1L << (L_BRACKET - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (EXCLAMATION - 128)) | (1L << (PLUS - 128)) | (1L << (MINUS - 128)) | (1L << (CARET - 128)) | (1L << (STAR - 128)) | (1L << (AMPERSAND - 128)) | (1L << (RECEIVE - 128)) | (1L << (DECIMAL_LIT - 128)) | (1L << (BINARY_LIT - 128)) | (1L << (OCTAL_LIT - 128)) | (1L << (HEX_LIT - 128)) | (1L << (IMAGINARY_LIT - 128)) | (1L << (RUNE_LIT - 128)) | (1L << (RAW_STRING_LIT - 128)) | (1L << (INTERPRETED_STRING_LIT - 128)))) != 0)) { { - setState(1697); + setState(1702); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,170,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,172,_ctx) ) { case 1: { - setState(1691); + setState(1696); expressionList(); } break; case 2: { - setState(1692); + setState(1697); nonNamedType(); - setState(1695); + setState(1700); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,171,_ctx) ) { case 1: { - setState(1693); + setState(1698); match(COMMA); - setState(1694); + setState(1699); expressionList(); } break; @@ -11945,22 +11968,22 @@ public final ArgumentsContext arguments() throws RecognitionException { } break; } - setState(1700); + setState(1705); _errHandler.sync(this); _la = _input.LA(1); if (_la==ELLIPSIS) { { - setState(1699); + setState(1704); match(ELLIPSIS); } } - setState(1703); + setState(1708); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(1702); + setState(1707); match(COMMA); } } @@ -11968,7 +11991,7 @@ public final ArgumentsContext arguments() throws RecognitionException { } } - setState(1707); + setState(1712); match(R_PAREN); } } @@ -12006,11 +12029,11 @@ public final MethodExprContext methodExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1709); + setState(1714); nonNamedType(); - setState(1710); + setState(1715); match(DOT); - setState(1711); + setState(1716); match(IDENTIFIER); } } @@ -12046,7 +12069,7 @@ public final ReceiverTypeContext receiverType() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(1713); + setState(1718); type_(); } } @@ -12080,34 +12103,34 @@ public final EosContext eos() throws RecognitionException { EosContext _localctx = new EosContext(_ctx, getState()); enterRule(_localctx, 348, RULE_eos); try { - setState(1719); + setState(1724); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,176,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1715); + setState(1720); match(SEMI); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1716); + setState(1721); match(EOF); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1717); + setState(1722); match(EOS); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1718); + setState(1723); if (!(closingBracket())) throw new FailedPredicateException(this, "closingBracket()"); } break; @@ -12190,7 +12213,7 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009e\u06bc\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009f\u06c1\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\t\31"+ @@ -12270,613 +12293,615 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { "\u047e\13\\\3\\\5\\\u0481\n\\\5\\\u0483\n\\\3\\\3\\\3]\3]\3]\3]\3]\3]"+ "\3]\5]\u048e\n]\3^\3^\3^\3^\3^\3_\3_\5_\u0497\n_\3_\3_\5_\u049b\n_\3_"+ "\5_\u049e\n_\3_\3_\3_\3_\3_\5_\u04a5\n_\3_\3_\3`\3`\3a\3a\3b\3b\3c\5c"+ - "\u04b0\nc\3c\3c\3d\3d\3d\3e\3e\3f\3f\3f\5f\u04bc\nf\3g\3g\3g\3g\3g\3g"+ - "\7g\u04c4\ng\fg\16g\u04c7\13g\3g\5g\u04ca\ng\3h\3h\5h\u04ce\nh\3h\3h\5"+ - "h\u04d2\nh\3i\3i\3i\7i\u04d7\ni\fi\16i\u04da\13i\3j\3j\3j\7j\u04df\nj"+ - "\fj\16j\u04e2\13j\3k\3k\3k\3k\3k\3k\7k\u04ea\nk\fk\16k\u04ed\13k\3k\5"+ - "k\u04f0\nk\3l\3l\5l\u04f4\nl\3l\3l\3m\3m\3m\3m\3m\3m\7m\u04fe\nm\fm\16"+ - "m\u0501\13m\3m\5m\u0504\nm\3n\3n\5n\u0508\nn\3n\3n\3o\5o\u050d\no\3o\3"+ - "o\3o\6o\u0512\no\ro\16o\u0513\3p\3p\3p\3p\3p\5p\u051b\np\3q\3q\3r\3r\3"+ - "r\3r\3s\3s\3s\3t\3t\3t\3t\3u\3u\3v\3v\3v\5v\u052f\nv\3w\3w\5w\u0533\n"+ - "w\3x\3x\5x\u0537\nx\3y\3y\5y\u053b\ny\3z\3z\3z\3{\3{\3|\3|\3|\3|\3|\3"+ - "|\3|\3|\3|\5|\u054b\n|\3|\3|\3|\3|\5|\u0551\n|\5|\u0553\n|\3}\3}\5}\u0557"+ - "\n}\3~\3~\5~\u055b\n~\3~\5~\u055e\n~\3~\3~\5~\u0562\n~\5~\u0564\n~\3~"+ - "\3~\7~\u0568\n~\f~\16~\u056b\13~\3~\3~\3\177\3\177\3\177\5\177\u0572\n"+ - "\177\3\u0080\3\u0080\3\u0080\5\u0080\u0577\n\u0080\3\u0081\3\u0081\3\u0081"+ - "\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\3\u0081\5\u0081\u0582\n\u0081"+ - "\3\u0081\3\u0081\7\u0081\u0586\n\u0081\f\u0081\16\u0081\u0589\13\u0081"+ - "\3\u0081\3\u0081\3\u0082\3\u0082\5\u0082\u058f\n\u0082\3\u0082\3\u0082"+ - "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\5\u0083\u059a"+ - "\n\u0083\3\u0084\3\u0084\3\u0084\5\u0084\u059f\n\u0084\3\u0085\3\u0085"+ - "\5\u0085\u05a3\n\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u05a8\n\u0085\7"+ - "\u0085\u05aa\n\u0085\f\u0085\16\u0085\u05ad\13\u0085\3\u0086\3\u0086\3"+ - "\u0086\7\u0086\u05b2\n\u0086\f\u0086\16\u0086\u05b5\13\u0086\3\u0086\3"+ - "\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u05bc\n\u0087\3\u0088\3\u0088\3"+ - "\u0088\5\u0088\u05c1\n\u0088\3\u0088\5\u0088\u05c4\n\u0088\3\u0089\3\u0089"+ - "\3\u0089\3\u0089\3\u0089\3\u0089\5\u0089\u05cc\n\u0089\3\u0089\3\u0089"+ - "\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05d4\n\u008a\3\u008a\3\u008a"+ - "\3\u008b\5\u008b\u05d9\n\u008b\3\u008b\3\u008b\5\u008b\u05dd\n\u008b\3"+ - "\u008b\3\u008b\5\u008b\u05e1\n\u008b\3\u008c\3\u008c\3\u008c\3\u008c\3"+ - "\u008c\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\3\u008c\3\u008d\3"+ - "\u008d\3\u008d\3\u008e\3\u008e\5\u008e\u05f3\n\u008e\3\u008f\3\u008f\3"+ - "\u008f\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092"+ - "\3\u0092\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094"+ - "\3\u0094\3\u0094\3\u0095\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0610"+ - "\n\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097"+ - "\3\u0097\5\u0097\u061b\n\u0097\3\u0098\3\u0098\5\u0098\u061f\n\u0098\3"+ - "\u0099\3\u0099\3\u0099\3\u0099\7\u0099\u0625\n\u0099\f\u0099\16\u0099"+ - "\u0628\13\u0099\3\u0099\5\u0099\u062b\n\u0099\5\u0099\u062d\n\u0099\3"+ - "\u0099\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\5\u009a\u0635\n\u009a\3"+ - "\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u063e\n"+ - "\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u0646\n"+ - "\u009c\3\u009d\3\u009d\3\u009d\5\u009d\u064b\n\u009d\3\u009e\3\u009e\3"+ - "\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1"+ - "\3\u00a2\3\u00a2\3\u00a2\5\u00a2\u065b\n\u00a2\5\u00a2\u065d\n\u00a2\3"+ - "\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3\7\u00a3\u0664\n\u00a3\f\u00a3\16"+ - "\u00a3\u0667\13\u00a3\3\u00a4\3\u00a4\3\u00a4\5\u00a4\u066c\n\u00a4\3"+ - "\u00a4\3\u00a4\3\u00a5\3\u00a5\5\u00a5\u0672\n\u00a5\3\u00a6\3\u00a6\5"+ - "\u00a6\u0676\n\u00a6\3\u00a7\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u067d"+ - "\n\u00a7\f\u00a7\16\u00a7\u0680\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8"+ - "\3\u00a8\3\u00a8\5\u00a8\u0688\n\u00a8\3\u00a8\5\u00a8\u068b\n\u00a8\3"+ - "\u00a9\3\u00a9\3\u00aa\5\u00aa\u0690\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3"+ - "\u00ab\3\u00ab\3\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad"+ - "\3\u00ad\3\u00ad\3\u00ad\3\u00ad\5\u00ad\u06a2\n\u00ad\5\u00ad\u06a4\n"+ - "\u00ad\3\u00ad\5\u00ad\u06a7\n\u00ad\3\u00ad\5\u00ad\u06aa\n\u00ad\5\u00ad"+ - "\u06ac\n\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af"+ - "\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0\5\u00b0\u06ba\n\u00b0\3\u00b0"+ - "\3\u02a1\4\u0092\u00a2\u00b1\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+ - "$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084"+ - "\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c"+ - "\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4"+ - "\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc"+ - "\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4"+ - "\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc"+ - "\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114"+ - "\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c"+ - "\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144"+ - "\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c"+ - "\u015e\2\25\4\2ccnn\3\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0081\u0087"+ - "\3\2\26\27\4\2|\u0080\u0085\u0086\6\2$$oo{{\u0082\u0084\3\2 \"\3\2\35"+ - "\37\4\2GHuz\6\2..\61\61\64\64[[\4\2{\u0080\u0082\u0086\3\2op\4\2ll\u009d"+ - "\u009d\4\2\u0088\u008b\u008d\u008e\3\2\u0094\u0095\2\u0718\2\u0160\3\2"+ - "\2\2\4\u0163\3\2\2\2\6\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f"+ - "\u017a\3\2\2\2\16\u0195\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad"+ - "\3\2\2\2\26\u01c3\3\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3"+ - "\2\2\2\36\u01d2\3\2\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2"+ - "&\u01ee\3\2\2\2(\u01f9\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3"+ - "\2\2\2\60\u0216\3\2\2\2\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2"+ - "\2\28\u022a\3\2\2\2:\u0237\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240"+ - "\3\2\2\2B\u0245\3\2\2\2D\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J"+ - "\u0265\3\2\2\2L\u026c\3\2\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2"+ - "\2\2T\u0295\3\2\2\2V\u02a1\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb"+ - "\3\2\2\2^\u02bd\3\2\2\2`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f"+ - "\u02e5\3\2\2\2h\u02eb\3\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2"+ - "\2\2p\u031c\3\2\2\2r\u0323\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336"+ - "\3\2\2\2z\u033c\3\2\2\2|\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2"+ - "\2\2\u0082\u0353\3\2\2\2\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088"+ - "\u0368\3\2\2\2\u008a\u0374\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2"+ - "\2\2\u0090\u0382\3\2\2\2\u0092\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096"+ - "\u03d4\3\2\2\2\u0098\u03d7\3\2\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2"+ - "\2\2\u009e\u03f3\3\2\2\2\u00a0\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4"+ - "\u0426\3\2\2\2\u00a6\u0429\3\2\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2"+ - "\2\2\u00ac\u044a\3\2\2\2\u00ae\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2"+ - "\u0471\3\2\2\2\u00b4\u0473\3\2\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2"+ - "\2\2\u00ba\u048f\3\2\2\2\u00bc\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0"+ - "\u04aa\3\2\2\2\u00c2\u04ac\3\2\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b3\3\2"+ - "\2\2\u00c8\u04b6\3\2\2\2\u00ca\u04bb\3\2\2\2\u00cc\u04bd\3\2\2\2\u00ce"+ - "\u04cb\3\2\2\2\u00d0\u04d3\3\2\2\2\u00d2\u04db\3\2\2\2\u00d4\u04e3\3\2"+ - "\2\2\u00d6\u04f1\3\2\2\2\u00d8\u04f7\3\2\2\2\u00da\u0505\3\2\2\2\u00dc"+ - "\u0511\3\2\2\2\u00de\u051a\3\2\2\2\u00e0\u051c\3\2\2\2\u00e2\u051e\3\2"+ - "\2\2\u00e4\u0522\3\2\2\2\u00e6\u0525\3\2\2\2\u00e8\u0529\3\2\2\2\u00ea"+ - "\u052b\3\2\2\2\u00ec\u0530\3\2\2\2\u00ee\u0534\3\2\2\2\u00f0\u0538\3\2"+ - "\2\2\u00f2\u053c\3\2\2\2\u00f4\u053f\3\2\2\2\u00f6\u0541\3\2\2\2\u00f8"+ - "\u0556\3\2\2\2\u00fa\u0558\3\2\2\2\u00fc\u056e\3\2\2\2\u00fe\u0576\3\2"+ - "\2\2\u0100\u0578\3\2\2\2\u0102\u058e\3\2\2\2\u0104\u0596\3\2\2\2\u0106"+ - "\u059e\3\2\2\2\u0108\u05a2\3\2\2\2\u010a\u05ae\3\2\2\2\u010c\u05b8\3\2"+ - "\2\2\u010e\u05c3\3\2\2\2\u0110\u05cb\3\2\2\2\u0112\u05cf\3\2\2\2\u0114"+ - "\u05d8\3\2\2\2\u0116\u05e8\3\2\2\2\u0118\u05ed\3\2\2\2\u011a\u05f2\3\2"+ - "\2\2\u011c\u05f4\3\2\2\2\u011e\u05f9\3\2\2\2\u0120\u05fb\3\2\2\2\u0122"+ - "\u05fd\3\2\2\2\u0124\u0600\3\2\2\2\u0126\u0604\3\2\2\2\u0128\u060f\3\2"+ - "\2\2\u012a\u0613\3\2\2\2\u012c\u061a\3\2\2\2\u012e\u061e\3\2\2\2\u0130"+ - "\u0620\3\2\2\2\u0132\u0630\3\2\2\2\u0134\u063d\3\2\2\2\u0136\u0645\3\2"+ - "\2\2\u0138\u064a\3\2\2\2\u013a\u064c\3\2\2\2\u013c\u064e\3\2\2\2\u013e"+ - "\u0650\3\2\2\2\u0140\u0654\3\2\2\2\u0142\u0657\3\2\2\2\u0144\u0660\3\2"+ - "\2\2\u0146\u066b\3\2\2\2\u0148\u0671\3\2\2\2\u014a\u0675\3\2\2\2\u014c"+ - "\u0677\3\2\2\2\u014e\u0687\3\2\2\2\u0150\u068c\3\2\2\2\u0152\u068f\3\2"+ - "\2\2\u0154\u0693\3\2\2\2\u0156\u0697\3\2\2\2\u0158\u069c\3\2\2\2\u015a"+ - "\u06af\3\2\2\2\u015c\u06b3\3\2\2\2\u015e\u06b9\3\2\2\2\u0160\u0161\5\u0092"+ - "J\2\u0161\u0162\7\2\2\3\u0162\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165"+ - "\7\2\2\3\u0165\5\3\2\2\2\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168"+ - "\7\3\2\2\2\u0169\u016e\5\n\6\2\u016a\u016b\7k\2\2\u016b\u016d\5\n\6\2"+ - "\u016c\u016a\3\2\2\2\u016d\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f"+ - "\3\2\2\2\u016f\t\3\2\2\2\u0170\u016e\3\2\2\2\u0171\u0173\7c\2\2\u0172"+ - "\u0174\7;\2\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2"+ - "\u0175\u0176\5\16\b\2\u0176\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2"+ - "\u0178\u0175\3\2\2\2\u0179\u017c\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b"+ - "\3\2\2\2\u017b\u017d\3\2\2\2\u017c\u017a\3\2\2\2\u017d\u017e\5\u00c6d"+ - "\2\u017e\u0184\5\u015e\u00b0\2\u017f\u0180\5\24\13\2\u0180\u0181\5\u015e"+ - "\u00b0\2\u0181\u0183\3\2\2\2\u0182\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184"+ - "\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2"+ - "\2\2\u0187\u018b\5v<\2\u0188\u018b\5\u00caf\2\u0189\u018b\5\26\f\2\u018a"+ - "\u0187\3\2\2\2\u018a\u0188\3\2\2\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2"+ - "\2\2\u018c\u018d\5\u015e\u00b0\2\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2"+ - "\2\u018f\u0192\3\2\2\2\u0190\u018e\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193"+ - "\3\2\2\2\u0192\u0190\3\2\2\2\u0193\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195"+ - "\u0196\7D\2\2\u0196\u0197\5\u0092J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2"+ - "\2\u0199\u019a\5\u0092J\2\u019a\21\3\2\2\2\u019b\u019c\5\20\t\2\u019c"+ - "\u019d\5\u015e\u00b0\2\u019d\u019f\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2"+ - "\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2"+ - "\u01a0\3\2\2\2\u01a3\u01a5\t\2\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2"+ - "\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a7\5\u00c8e\2\u01a7\23\3\2\2\2\u01a8"+ - "\u01a9\5\20\t\2\u01a9\u01aa\5\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab"+ - "\u01a8\3\2\2\2\u01ac\u01af\3\2\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2"+ - "\2\2\u01ae\u01bd\3\2\2\2\u01af\u01ad\3\2\2\2\u01b0\u01b1\7_\2\2\u01b1"+ - "\u01be\5\22\n\2\u01b2\u01b3\7_\2\2\u01b3\u01b9\7d\2\2\u01b4\u01b5\5\22"+ - "\n\2\u01b5\u01b6\5\u015e\u00b0\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2"+ - "\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc"+ - "\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc\u01be\7e\2\2\u01bd\u01b0\3\2\2\2\u01bd"+ - "\u01b2\3\2\2\2\u01be\25\3\2\2\2\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2"+ - "\u01c1\u01c4\5\u0082B\2\u01c2\u01c4\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0"+ - "\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5"+ - "\u01c6\7\34\2\2\u01c6\u01cc\5\u0094K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc"+ - "\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2"+ - "\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce"+ - "\5\34\17\2\u01ce\33\3\2\2\2\u01cf\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1"+ - "\35\3\2\2\2\u01d2\u01d3\7C\2\2\u01d3\u01d5\7d\2\2\u01d4\u01d6\5\u00dc"+ - "o\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7"+ - "\u01d8\7e\2\2\u01d8\37\3\2\2\2\u01d9\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db"+ - "\u01e6\5B\"\2\u01dc\u01e6\5$\23\2\u01dd\u01e6\5@!\2\u01de\u01e6\58\35"+ - "\2\u01df\u01e6\5> \2\u01e0\u01e6\5\66\34\2\u01e1\u01e6\5\62\32\2\u01e2"+ - "\u01e6\5\60\31\2\u01e3\u01e6\5\64\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9"+ - "\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5"+ - "\u01dd\3\2\2\2\u01e5\u01de\3\2\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2"+ - "\2\2\u01e5\u01e1\3\2\2\2\u01e5\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5"+ - "\u01e4\3\2\2\2\u01e6!\3\2\2\2\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9"+ - "\u01ea\7\\\2\2\u01ea\u01eb\7h\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7"+ - "i\2\2\u01ed%\3\2\2\2\u01ee\u01f3\5(\25\2\u01ef\u01f0\7k\2\2\u01f0\u01f2"+ - "\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3"+ - "\u01f4\3\2\2\2\u01f4\u01f7\3\2\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7k"+ - "\2\2\u01f7\u01f6\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe"+ - "\7c\2\2\u01fa\u01fb\7k\2\2\u01fb\u01fd\7c\2\2\u01fc\u01fa\3\2\2\2\u01fd"+ - "\u0200\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2"+ - "\2\2\u0200\u01fe\3\2\2\2\u0201\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203"+ - "\u0205\5,\27\2\u0204\u0203\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2"+ - "\2\2\u0206\u0207\3\2\2\2\u0207+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a"+ - "\7f\2\2\u020a\u020f\5\u0092J\2\u020b\u020c\7k\2\2\u020c\u020e\5\u0092"+ - "J\2\u020d\u020b\3\2\2\2\u020e\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f"+ - "\u0210\3\2\2\2\u0210\u0212\3\2\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7g"+ - "\2\2\u0213-\3\2\2\2\u0214\u0215\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217"+ - "\7\62\2\2\u0217\u0218\7d\2\2\u0218\u0219\5\u0092J\2\u0219\u021a\7e\2\2"+ - "\u021a\61\3\2\2\2\u021b\u021c\7\66\2\2\u021c\u021d\7h\2\2\u021d\u021e"+ - "\5\u00b0Y\2\u021e\u021f\7i\2\2\u021f\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221"+ - "\u0222\7d\2\2\u0222\u0223\5\u0092J\2\u0223\u0224\7e\2\2\u0224\65\3\2\2"+ - "\2\u0225\u0226\t\6\2\2\u0226\u0227\7d\2\2\u0227\u0228\5\u0092J\2\u0228"+ - "\u0229\7e\2\2\u0229\67\3\2\2\2\u022a\u022f\7\23\2\2\u022b\u022c\7h\2\2"+ - "\u022c\u022d\5:\36\2\u022d\u022e\7i\2\2\u022e\u0230\3\2\2\2\u022f\u022b"+ - "\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\3\2\2\2\u0231\u0232\7d\2\2\u0232"+ - "\u0233\5\u0092J\2\u0233\u0234\7e\2\2\u02349\3\2\2\2\u0235\u0238\5<\37"+ - "\2\u0236\u0238\7\25\2\2\u0237\u0235\3\2\2\2\u0237\u0236\3\2\2\2\u0238"+ - ";\3\2\2\2\u0239\u023a\7c\2\2\u023a=\3\2\2\2\u023b\u023c\7\24\2\2\u023c"+ - "\u023d\7d\2\2\u023d\u023e\5\u0092J\2\u023e\u023f\7e\2\2\u023f?\3\2\2\2"+ - "\u0240\u0241\79\2\2\u0241\u0242\7d\2\2\u0242\u0243\5\u0092J\2\u0243\u0244"+ - "\7e\2\2\u0244A\3\2\2\2\u0245\u0246\78\2\2\u0246\u0247\7d\2\2\u0247\u0248"+ - "\5\u0092J\2\u0248\u0249\7e\2\2\u0249C\3\2\2\2\u024a\u024b\7\30\2\2\u024b"+ - "\u024c\7d\2\2\u024c\u024f\5\u0092J\2\u024d\u024e\7k\2\2\u024e\u0250\5"+ - "\u0092J\2\u024f\u024d\3\2\2\2\u024f\u0250\3\2\2\2\u0250\u0251\3\2\2\2"+ - "\u0251\u0252\7e\2\2\u0252E\3\2\2\2\u0253\u0254\t\6\2\2\u0254\u0255\7h"+ - "\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7<\2\2\u0257\u0258\5\u0092J\2"+ - "\u0258\u0259\7i\2\2\u0259G\3\2\2\2\u025a\u025b\7h\2\2\u025b\u0260\5J&"+ - "\2\u025c\u025d\7k\2\2\u025d\u025f\5J&\2\u025e\u025c\3\2\2\2\u025f\u0262"+ - "\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u0263\3\2\2\2\u0262"+ - "\u0260\3\2\2\2\u0263\u0264\7i\2\2\u0264I\3\2\2\2\u0265\u0266\5\u0092J"+ - "\2\u0266\u0267\7j\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2\2\2\u0269\u026d"+ - "\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269\3\2\2\2\u026c\u026a"+ - "\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e\u026f\7\64\2\2\u026f"+ - "\u0275\7f\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e\u00b0\2\u0272\u0274"+ - "\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275\u0273\3\2\2\2\u0275"+ - "\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2\2\2\u0278\u0279\7g"+ - "\2\2\u0279O\3\2\2\2\u027a\u027b\7K\2\2\u027b\u027c\7c\2\2\u027c\u0284"+ - "\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7f\2\2\u027f\u0280\5"+ - "\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7g\2\2\u0282\u0284\3"+ - "\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284Q\3\2\2\2\u0285\u0286"+ - "\7\34\2\2\u0286\u0287\7h\2\2\u0287\u0288\7i\2\2\u0288\u0289\5\u0120\u0091"+ - "\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c\7h\2\2\u028c\u028d\5"+ - "\u00b0Y\2\u028d\u028e\7i\2\2\u028e\u0296\3\2\2\2\u028f\u0290\7,\2\2\u0290"+ - "\u0291\7h\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293\7i\2\2\u0293\u0294\5"+ - "\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2\u0295\u028f\3\2\2\2"+ - "\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20\2\2\u0299\u029d\b,"+ - "\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297\3\2\2\2\u029c\u0298"+ - "\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u02a0\5\u015e\u00b0"+ - "\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a1\u029f"+ - "\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4\u02a5\7\20\2\2"+ - "\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7W\3\2"+ - "\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab\7\f\2\2\u02ab"+ - "\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae\u02af\7\17"+ - "\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2\2\2\u02b0\u02ac"+ - "\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4\5\u00d2j\2\u02b3"+ - "\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2\2\u02b5\u02b6\7Z"+ - "\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8"+ - "[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092J\2\u02bb\u02b9\3\2\2"+ - "\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2\7f\2\2\u02be\u02bf\7"+ - ":\2\2\u02bf\u02c0\5\u00d0i\2\u02c0\u02c1\5\u015e\u00b0\2\u02c1\u02c3\3"+ - "\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3\u02c5\3\2\2\2\u02c4"+ - "\u02c6\5\u00dco\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6\3\2\2\2\u02c6\u02c7"+ - "\3\2\2\2\u02c7\u02c8\7g\2\2\u02c8_\3\2\2\2\u02c9\u02cc\5\u013e\u00a0\2"+ - "\u02ca\u02cc\7c\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3\2\2\2\u02cc\u02d5"+ - "\3\2\2\2\u02cd\u02d2\7f\2\2\u02ce\u02d0\5b\62\2\u02cf\u02d1\7k\2\2\u02d0"+ - "\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2\2\2\u02d2\u02ce\3\2"+ - "\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d6\7g\2\2\u02d5"+ - "\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7\u02dc\5d\63\2"+ - "\u02d8\u02d9\7k\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2\2\2\u02db\u02de"+ - "\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02ddc\3\2\2\2\u02de"+ - "\u02dc\3\2\2\2\u02df\u02e0\7c\2\2\u02e0\u02e2\7m\2\2\u02e1\u02df\3\2\2"+ - "\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092J\2\u02e4"+ - "e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8\7\21\2"+ - "\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dan\2\u02eag\3\2\2\2\u02eb\u02ec"+ - "\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4\7"+ - "f\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2\2"+ - "\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4\u02f5"+ - "\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j\66\2\u02f8"+ - "\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2\2\2\u02fb\u02fe"+ - "\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02ff\3\2\2\2\u02fe"+ - "\u02fc\3\2\2\2\u02ff\u0301\7g\2\2\u0300\u02ee\3\2\2\2\u0300\u0301\3\2"+ - "\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302\3\2\2\2\u0303\u0304"+ - "\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306\u0307\7c\2\2\u0307"+ - "\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dan\2\u0309\u0308\3\2\2\2\u0309"+ - "\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7d\2\2\u030c\u030e\7c\2\2\u030d"+ - "\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2\2\2\u030f\u0311\7\u0085"+ - "\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0312\3\2\2\2\u0312"+ - "\u0313\5\u011a\u008e\2\u0313\u0314\7e\2\2\u0314m\3\2\2\2\u0315\u031b\5"+ - "\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7n\2\2\u0318\u0319\7c\2\2"+ - "\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316\3\2\2\2\u031bo\3"+ - "\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7c\2\2\u031e\u0321\7q\2\2\u031f"+ - "\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f\3\2\2\2\u0321\u0320"+ - "\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324\u0325\7d\2\2\u0325"+ - "\u0328\5\u00b0Y\2\u0326\u0327\7k\2\2\u0327\u0329\5\u00d2j\2\u0328\u0326"+ - "\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2\u032a\u032b\7e\2\2\u032b"+ - "s\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7d\2\2\u032e\u032f\5\u00b0Y\2"+ - "\u032f\u0330\7e\2\2\u0330u\3\2\2\2\u0331\u0334\5V,\2\u0332\u0335\5x=\2"+ - "\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333\3\2\2\2\u0335w\3\2"+ - "\2\2\u0336\u0337\7K\2\2\u0337\u0338\7c\2\2\u0338\u033a\5\u012c\u0097\2"+ - "\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3\2\2\2\u033by\3"+ - "\2\2\2\u033c\u033d\7K\2\2\u033d\u033e\5\u0088E\2\u033e\u033f\7c\2\2\u033f"+ - "\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340\3\2\2\2\u0341\u0342"+ - "\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344\u0347\5v<\2\u0345\u0347"+ - "\5\u00caf\2\u0346\u0344\3\2\2\2\u0346\u0345\3\2\2\2\u0347}\3\2\2\2\u0348"+ - "\u0349\7\67\2\2\u0349\u034a\7c\2\2\u034a\u034c\5\u0130\u0099\2\u034b\u034d"+ - "\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d\3\2\2\2\u034d\177\3\2\2\2"+ - "\u034e\u034f\7f\2\2\u034f\u0350\5\u0092J\2\u0350\u0351\5\u015e\u00b0\2"+ - "\u0351\u0352\7g\2\2\u0352\u0081\3\2\2\2\u0353\u0354\7\67\2\2\u0354\u0355"+ - "\5\u0088E\2\u0355\u0356\7c\2\2\u0356\u0358\5\u0130\u0099\2\u0357\u0359"+ - "\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u0083\3\2\2"+ - "\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c\u035d\7j\2\2\u035d"+ - "\u035f\5\u00d2j\2\u035e\u035c\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0363"+ - "\3\2\2\2\u0360\u0361\7j\2\2\u0361\u0363\5\u00d2j\2\u0362\u035b\3\2\2\2"+ - "\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b\5\2\u0365\u0366"+ - "\7q\2\2\u0366\u0367\5\u00d2j\2\u0367\u0087\3\2\2\2\u0368\u036a\7d\2\2"+ - "\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036c"+ - "\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7k\2\2\u036e\u036d\3\2\2\2"+ - "\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7e\2\2\u0371\u0089"+ - "\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2\u0374\u0372\3\2"+ - "\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378\5\u00d0i\2\u0377"+ - "\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2\2\u0379\u037a\5\u0090"+ - "I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c\u037e\5\u00d0i\2\u037d"+ - "\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f\3\2\2\2\u037f\u0380\5\u0090"+ - "I\2\u0380\u008f\3\2\2\2\u0381\u0383\7r\2\2\u0382\u0381\3\2\2\2\u0382\u0383"+ - "\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385\5\u00b0Y\2\u0385\u0091\3\2\2"+ - "\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2\u0388\u0397\5\u0092J\20\u0389"+ - "\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b\u038c\5.\30\2\u038c\u038d"+ - "\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397\3\2\2\2\u038f\u0390\t\t\2"+ - "\2\u0390\u0391\5&\24\2\u0391\u0392\7m\2\2\u0392\u0393\7m\2\2\u0393\u0394"+ - "\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3\2\2\2\u0396\u0386\3\2\2"+ - "\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396\u038f\3\2\2\2\u0397\u03bb"+ - "\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t\n\2\2\u039a\u03ba\5\u0092"+ - "J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2\2\u039d\u03ba\5\u0092J\16"+ - "\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0\u03ba\5\u0092J\r\u03a1"+ - "\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba\5\u0092J\f\u03a4\u03a5"+ - "\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092J\13\u03a7\u03a8\f\b"+ - "\2\2\u03a8\u03a9\7t\2\2\u03a9\u03ba\5\u0092J\t\u03aa\u03ab\f\7\2\2\u03ab"+ - "\u03ac\7s\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f\6\2\2\u03ae\u03af\7"+ - "#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1\u03b2\7&\2\2\u03b2"+ - "\u03b3\5\u0092J\2\u03b3\u03b4\7m\2\2\u03b4\u03b5\5\u0092J\5\u03b5\u03ba"+ - "\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2\u03b8\u03ba\5`\61\2"+ - "\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e\3\2\2\2\u03b9\u03a1"+ - "\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9\u03aa\3\2\2\2\u03b9"+ - "\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2\2\2\u03ba\u03bd\3\2"+ - "\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u0093\3\2\2\2\u03bd"+ - "\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5\32\16\2\u03c0\u03d3"+ - "\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00caf\2\u03c3\u03d3"+ - "\5\u00eav\2\u03c4\u03d3\5\u00dep\2\u03c5\u03d3\5\u0118\u008d\2\u03c6\u03d3"+ - "\5\u00ecw\2\u03c7\u03d3\5\u00eex\2\u03c8\u03d3\5\u00f0y\2\u03c9\u03d3"+ - "\5\u00f2z\2\u03ca\u03d3\5\u00f4{\2\u03cb\u03d3\5\u00dan\2\u03cc\u03d3"+ - "\5\u00f6|\2\u03cd\u03d3\5\u00f8}\2\u03ce\u03d3\5\u010a\u0086\2\u03cf\u03d3"+ - "\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f\64\2\u03d2\u03be\3\2"+ - "\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2\u03c1\3\2\2\2\u03d2"+ - "\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2\2\2\u03d2\u03c5\3\2"+ - "\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2\u03c8\3\2\2\2\u03d2"+ - "\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2\2\2\u03d2\u03cc\3\2"+ - "\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2\u03cf\3\2\2\2\u03d2"+ - "\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2\2\2\u03d4\u03d5\7%"+ - "\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7\u03d8\7V\2\2\u03d8"+ - "\u03da\5\u0092J\2\u03d9\u03db\5\u00dan\2\u03da\u03d9\3\2\2\2\u03da\u03db"+ - "\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO\2\u03dd\u03de\5\u0112"+ - "\u008a\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2\2\u03e0\u03e1\5\u0092"+ - "J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2\2\2\u03e3\u03df\3\2\2"+ - "\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5\u03e6\3\2\2\2\u03e6\u03ec"+ - "\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17\2\2\u03e9\u03ea\5Z.\2\u03ea"+ - "\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2\u03ec\u03e8\3\2\2\2\u03ec\u03ed"+ - "\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef\7O\2\2\u03ef\u03f4\5\u0092J\2"+ - "\u03f0\u03f1\7O\2\2\u03f1\u03f2\t\3\2\2\u03f2\u03f4\5.\30\2\u03f3\u03ee"+ - "\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6"+ - "\u03fe\7\6\2\2\u03f7\u03fe\7b\2\2\u03f8\u03fe\5\u013a\u009e\2\u03f9\u03fe"+ - "\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2\u03fb\u03fe\7\u008d\2\2\u03fc\u03fe"+ - "\7\u008e\2\2\u03fd\u03f5\3\2\2\2\u03fd\u03f6\3\2\2\2\u03fd\u03f7\3\2\2"+ - "\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb"+ - "\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400"+ - "\u040c\5\u0136\u009c\2\u0401\u040c\5\u0132\u009a\2\u0402\u040c\5\u015a"+ - "\u00ae\2\u0403\u040c\5 \21\2\u0404\u040c\5t;\2\u0405\u040c\5r:\2\u0406"+ - "\u0407\t\17\2\2\u0407\u0408\7d\2\2\u0408\u0409\5\u0092J\2\u0409\u040a"+ - "\7e\2\2\u040a\u040c\3\2\2\2\u040b\u03ff\3\2\2\2\u040b\u0401\3\2\2\2\u040b"+ - "\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b\u0404\3\2\2\2\u040b\u0405\3\2"+ - "\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2\2\2\u040d\u040e\f\13\2\2\u040e"+ - "\u040f\7n\2\2\u040f\u0422\7c\2\2\u0410\u0411\f\n\2\2\u0411\u0422\5\u0154"+ - "\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422\5\u00bc_\2\u0414\u0415\f\b\2"+ - "\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2\u0417\u0422\5\u0156\u00ac\2\u0418"+ - "\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad\2\u041a\u041b\f\5\2\2\u041b\u041c"+ - "\5\u0158\u00ad\2\u041c\u041d\7\22\2\2\u041d\u041e\5`\61\2\u041e\u0422"+ - "\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422\5\u00a8U\2\u0421\u040d\3\2\2"+ - "\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2\2\u0421\u0414\3\2\2\2\u0421\u0416"+ - "\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a\3\2\2\2\u0421\u041f\3\2\2\2\u0422"+ - "\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423\u0424\3\2\2\2\u0424\u00a3\3\2"+ - "\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V,\2\u0427\u0428\5\u00a6T\2\u0428"+ - "\u00a5\3\2\2\2\u0429\u042b\7K\2\2\u042a\u042c\7c\2\2\u042b\u042a\3\2\2"+ - "\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2\2\2\u042d\u042f\5\u012c\u0097\2"+ - "\u042e\u0430\5^\60\2\u042f\u042e\3\2\2\2\u042f\u0430\3\2\2\2\u0430\u00a7"+ - "\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434\5\u00d2j\2\u0433\u0432\3\2\2"+ - "\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2\2\u0435\u0437\7k\2\2\u0436\u0435"+ - "\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438\3\2\2\2\u0438\u0439\7(\2\2\u0439"+ - "\u00a9\3\2\2\2\u043a\u043b\7L\2\2\u043b\u0445\7f\2\2\u043c\u0440\5\u00ae"+ - "X\2\u043d\u0440\5\u011a\u008e\2\u043e\u0440\5\u00acW\2\u043f\u043c\3\2"+ - "\2\2\u043f\u043d\3\2\2\2\u043f\u043e\3\2\2\2\u0440\u0441\3\2\2\2\u0441"+ - "\u0442\5\u015e\u00b0\2\u0442\u0444\3\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447"+ - "\3\2\2\2\u0445\u0443\3\2\2\2\u0445\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447"+ - "\u0445\3\2\2\2\u0448\u0449\7g\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67"+ - "\2\2\u044b\u044c\7c\2\2\u044c\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2"+ - "\2\u044e\u0450\7\34\2\2\u044f\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450"+ - "\u0451\3\2\2\2\u0451\u0452\5V,\2\u0452\u0453\7c\2\2\u0453\u0454\5\u0130"+ - "\u0099\2\u0454\u0455\5\u012e\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7"+ - "\34\2\2\u0457\u0456\3\2\2\2\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459"+ - "\u045a\5V,\2\u045a\u045b\7c\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e"+ - "\3\2\2\2\u045d\u044f\3\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f"+ - "\u0467\5\u011a\u008e\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462"+ - "\u0463\7d\2\2\u0463\u0464\5\u00b0Y\2\u0464\u0465\7e\2\2\u0465\u0467\3"+ - "\2\2\2\u0466\u045f\3\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466"+ - "\u0462\3\2\2\2\u0467\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472"+ - "\5\u014c\u00a7\2\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096"+ - "\2\u046c\u0472\5\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126"+ - "\u0094\2\u046f\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468"+ - "\3\2\2\2\u0471\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471"+ - "\u046c\3\2\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2"+ - "\2\2\u0471\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474"+ - "\u0475\5\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7d\2\2\u0477\u047c"+ - "\5\u00b0Y\2\u0478\u0479\7k\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2"+ - "\2\2\u047b\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d"+ - "\u0480\3\2\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7k\2\2\u0480\u047f\3\2"+ - "\2\2\u0480\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482"+ - "\u0483\3\2\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7e\2\2\u0485\u00b7\3\2"+ - "\2\2\u0486\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e"+ - "\5\u00ba^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b"+ - "\u048e\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487"+ - "\3\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+ - "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7h"+ - "\2\2\u0490\u0491\7r\2\2\u0491\u0492\7i\2\2\u0492\u0493\5\u0120\u0091\2"+ - "\u0493\u00bb\3\2\2\2\u0494\u04a4\7h\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+ - "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7m\2\2\u0499"+ + "\u04b0\nc\3c\3c\3d\3d\3d\3d\3d\3d\5d\u04ba\nd\3d\3d\3d\3d\5d\u04c0\nd"+ + "\5d\u04c2\nd\3e\3e\3e\3f\3f\3g\3g\3g\5g\u04cc\ng\3h\3h\3h\3h\3h\3h\7h"+ + "\u04d4\nh\fh\16h\u04d7\13h\3h\5h\u04da\nh\3i\3i\5i\u04de\ni\3i\3i\5i\u04e2"+ + "\ni\3j\3j\3j\7j\u04e7\nj\fj\16j\u04ea\13j\3k\3k\3k\7k\u04ef\nk\fk\16k"+ + "\u04f2\13k\3l\3l\3l\3l\3l\3l\7l\u04fa\nl\fl\16l\u04fd\13l\3l\5l\u0500"+ + "\nl\3m\3m\5m\u0504\nm\3m\3m\3n\3n\3n\3n\3n\3n\7n\u050e\nn\fn\16n\u0511"+ + "\13n\3n\5n\u0514\nn\3o\3o\5o\u0518\no\3o\3o\3p\5p\u051d\np\3p\3p\3p\6"+ + "p\u0522\np\rp\16p\u0523\3q\3q\3q\3q\3q\5q\u052b\nq\3r\3r\3s\3s\3s\3s\3"+ + "t\3t\3t\3u\3u\3u\3u\3v\3v\3w\3w\3w\5w\u053f\nw\3x\3x\5x\u0543\nx\3y\3"+ + "y\5y\u0547\ny\3z\3z\5z\u054b\nz\3{\3{\3{\3|\3|\3}\3}\3}\3}\3}\3}\3}\3"+ + "}\3}\5}\u055b\n}\3}\3}\3}\3}\5}\u0561\n}\5}\u0563\n}\3~\3~\5~\u0567\n"+ + "~\3\177\3\177\5\177\u056b\n\177\3\177\5\177\u056e\n\177\3\177\3\177\5"+ + "\177\u0572\n\177\5\177\u0574\n\177\3\177\3\177\7\177\u0578\n\177\f\177"+ + "\16\177\u057b\13\177\3\177\3\177\3\u0080\3\u0080\3\u0080\5\u0080\u0582"+ + "\n\u0080\3\u0081\3\u0081\3\u0081\5\u0081\u0587\n\u0081\3\u0082\3\u0082"+ + "\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\3\u0082\5\u0082\u0592"+ + "\n\u0082\3\u0082\3\u0082\7\u0082\u0596\n\u0082\f\u0082\16\u0082\u0599"+ + "\13\u0082\3\u0082\3\u0082\3\u0083\3\u0083\5\u0083\u059f\n\u0083\3\u0083"+ + "\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084\5\u0084"+ + "\u05aa\n\u0084\3\u0085\3\u0085\3\u0085\5\u0085\u05af\n\u0085\3\u0086\3"+ + "\u0086\5\u0086\u05b3\n\u0086\3\u0086\3\u0086\3\u0086\5\u0086\u05b8\n\u0086"+ + "\7\u0086\u05ba\n\u0086\f\u0086\16\u0086\u05bd\13\u0086\3\u0087\3\u0087"+ + "\3\u0087\7\u0087\u05c2\n\u0087\f\u0087\16\u0087\u05c5\13\u0087\3\u0087"+ + "\3\u0087\3\u0088\3\u0088\3\u0088\5\u0088\u05cc\n\u0088\3\u0089\3\u0089"+ + "\3\u0089\5\u0089\u05d1\n\u0089\3\u0089\5\u0089\u05d4\n\u0089\3\u008a\3"+ + "\u008a\3\u008a\3\u008a\3\u008a\3\u008a\5\u008a\u05dc\n\u008a\3\u008a\3"+ + "\u008a\3\u008b\3\u008b\3\u008b\3\u008b\5\u008b\u05e4\n\u008b\3\u008b\3"+ + "\u008b\3\u008c\5\u008c\u05e9\n\u008c\3\u008c\3\u008c\5\u008c\u05ed\n\u008c"+ + "\3\u008c\3\u008c\5\u008c\u05f1\n\u008c\3\u008d\3\u008d\3\u008d\3\u008e"+ + "\3\u008e\5\u008e\u05f8\n\u008e\3\u008f\3\u008f\3\u008f\3\u008f\3\u008f"+ + "\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0093\3\u0093"+ + "\3\u0093\3\u0093\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0094\3\u0095"+ + "\3\u0095\3\u0095\3\u0095\3\u0095\5\u0095\u0615\n\u0095\3\u0095\3\u0095"+ + "\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097\3\u0097\5\u0097\u0620"+ + "\n\u0097\3\u0098\3\u0098\5\u0098\u0624\n\u0098\3\u0099\3\u0099\3\u0099"+ + "\3\u0099\7\u0099\u062a\n\u0099\f\u0099\16\u0099\u062d\13\u0099\3\u0099"+ + "\5\u0099\u0630\n\u0099\5\u0099\u0632\n\u0099\3\u0099\3\u0099\3\u009a\3"+ + "\u009a\3\u009a\3\u009a\5\u009a\u063a\n\u009a\3\u009a\3\u009a\3\u009b\3"+ + "\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u0643\n\u009b\3\u009c\3\u009c\3"+ + "\u009c\3\u009c\3\u009c\3\u009c\5\u009c\u064b\n\u009c\3\u009d\3\u009d\3"+ + "\u009d\5\u009d\u0650\n\u009d\3\u009e\3\u009e\3\u009f\3\u009f\3\u00a0\3"+ + "\u00a0\3\u00a0\3\u00a0\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2"+ + "\5\u00a2\u0660\n\u00a2\5\u00a2\u0662\n\u00a2\3\u00a2\3\u00a2\3\u00a3\3"+ + "\u00a3\3\u00a3\7\u00a3\u0669\n\u00a3\f\u00a3\16\u00a3\u066c\13\u00a3\3"+ + "\u00a4\3\u00a4\3\u00a4\5\u00a4\u0671\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3"+ + "\u00a5\5\u00a5\u0677\n\u00a5\3\u00a6\3\u00a6\5\u00a6\u067b\n\u00a6\3\u00a7"+ + "\3\u00a7\3\u00a7\3\u00a7\3\u00a7\7\u00a7\u0682\n\u00a7\f\u00a7\16\u00a7"+ + "\u0685\13\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a8\5\u00a8"+ + "\u068d\n\u00a8\3\u00a8\5\u00a8\u0690\n\u00a8\3\u00a9\3\u00a9\3\u00aa\5"+ + "\u00aa\u0695\n\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3"+ + "\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad"+ + "\3\u00ad\5\u00ad\u06a7\n\u00ad\5\u00ad\u06a9\n\u00ad\3\u00ad\5\u00ad\u06ac"+ + "\n\u00ad\3\u00ad\5\u00ad\u06af\n\u00ad\5\u00ad\u06b1\n\u00ad\3\u00ad\3"+ + "\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00b0\3\u00b0"+ + "\3\u00b0\3\u00b0\5\u00b0\u06bf\n\u00b0\3\u00b0\3\u02a1\4\u0092\u00a2\u00b1"+ + "\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+ + "JLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c"+ + "\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4"+ + "\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc"+ + "\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4"+ + "\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec"+ + "\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102\u0104"+ + "\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c"+ + "\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134"+ + "\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a\u014c"+ + "\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\2\25\4\2ddoo\3"+ + "\2\31\32\3\2\7\n\3\2@A\3\2)+\4\2)+--\3\2\u0082\u0088\3\2\26\27\4\2}\u0081"+ + "\u0086\u0087\6\2$$pp||\u0083\u0085\3\2 \"\3\2\35\37\4\2GHv{\6\2..\61\61"+ + "\64\64\\\\\4\2|\u0081\u0083\u0087\3\2pq\4\2mm\u009e\u009e\4\2\u0089\u008c"+ + "\u008e\u008f\3\2\u0095\u0096\2\u071f\2\u0160\3\2\2\2\4\u0163\3\2\2\2\6"+ + "\u0166\3\2\2\2\b\u0169\3\2\2\2\n\u0171\3\2\2\2\f\u017a\3\2\2\2\16\u0195"+ + "\3\2\2\2\20\u0198\3\2\2\2\22\u01a0\3\2\2\2\24\u01ad\3\2\2\2\26\u01c3\3"+ + "\2\2\2\30\u01cb\3\2\2\2\32\u01cd\3\2\2\2\34\u01cf\3\2\2\2\36\u01d2\3\2"+ + "\2\2 \u01e5\3\2\2\2\"\u01e7\3\2\2\2$\u01e9\3\2\2\2&\u01ee\3\2\2\2(\u01f9"+ + "\3\2\2\2*\u0206\3\2\2\2,\u0209\3\2\2\2.\u0214\3\2\2\2\60\u0216\3\2\2\2"+ + "\62\u021b\3\2\2\2\64\u0220\3\2\2\2\66\u0225\3\2\2\28\u022a\3\2\2\2:\u0237"+ + "\3\2\2\2<\u0239\3\2\2\2>\u023b\3\2\2\2@\u0240\3\2\2\2B\u0245\3\2\2\2D"+ + "\u024a\3\2\2\2F\u0253\3\2\2\2H\u025a\3\2\2\2J\u0265\3\2\2\2L\u026c\3\2"+ + "\2\2N\u026e\3\2\2\2P\u0283\3\2\2\2R\u0285\3\2\2\2T\u0295\3\2\2\2V\u02a1"+ + "\3\2\2\2X\u02b0\3\2\2\2Z\u02b3\3\2\2\2\\\u02bb\3\2\2\2^\u02bd\3\2\2\2"+ + "`\u02cb\3\2\2\2b\u02d7\3\2\2\2d\u02e1\3\2\2\2f\u02e5\3\2\2\2h\u02eb\3"+ + "\2\2\2j\u0303\3\2\2\2l\u030b\3\2\2\2n\u031a\3\2\2\2p\u031c\3\2\2\2r\u0323"+ + "\3\2\2\2t\u032c\3\2\2\2v\u0331\3\2\2\2x\u0336\3\2\2\2z\u033c\3\2\2\2|"+ + "\u0343\3\2\2\2~\u0348\3\2\2\2\u0080\u034e\3\2\2\2\u0082\u0353\3\2\2\2"+ + "\u0084\u035a\3\2\2\2\u0086\u0364\3\2\2\2\u0088\u0368\3\2\2\2\u008a\u0374"+ + "\3\2\2\2\u008c\u0377\3\2\2\2\u008e\u037b\3\2\2\2\u0090\u0382\3\2\2\2\u0092"+ + "\u0396\3\2\2\2\u0094\u03d2\3\2\2\2\u0096\u03d4\3\2\2\2\u0098\u03d7\3\2"+ + "\2\2\u009a\u03dc\3\2\2\2\u009c\u03e5\3\2\2\2\u009e\u03f3\3\2\2\2\u00a0"+ + "\u03fd\3\2\2\2\u00a2\u040b\3\2\2\2\u00a4\u0426\3\2\2\2\u00a6\u0429\3\2"+ + "\2\2\u00a8\u0431\3\2\2\2\u00aa\u043a\3\2\2\2\u00ac\u044a\3\2\2\2\u00ae"+ + "\u045d\3\2\2\2\u00b0\u0466\3\2\2\2\u00b2\u0471\3\2\2\2\u00b4\u0473\3\2"+ + "\2\2\u00b6\u0476\3\2\2\2\u00b8\u048d\3\2\2\2\u00ba\u048f\3\2\2\2\u00bc"+ + "\u0494\3\2\2\2\u00be\u04a8\3\2\2\2\u00c0\u04aa\3\2\2\2\u00c2\u04ac\3\2"+ + "\2\2\u00c4\u04af\3\2\2\2\u00c6\u04b9\3\2\2\2\u00c8\u04c3\3\2\2\2\u00ca"+ + "\u04c6\3\2\2\2\u00cc\u04cb\3\2\2\2\u00ce\u04cd\3\2\2\2\u00d0\u04db\3\2"+ + "\2\2\u00d2\u04e3\3\2\2\2\u00d4\u04eb\3\2\2\2\u00d6\u04f3\3\2\2\2\u00d8"+ + "\u0501\3\2\2\2\u00da\u0507\3\2\2\2\u00dc\u0515\3\2\2\2\u00de\u0521\3\2"+ + "\2\2\u00e0\u052a\3\2\2\2\u00e2\u052c\3\2\2\2\u00e4\u052e\3\2\2\2\u00e6"+ + "\u0532\3\2\2\2\u00e8\u0535\3\2\2\2\u00ea\u0539\3\2\2\2\u00ec\u053b\3\2"+ + "\2\2\u00ee\u0540\3\2\2\2\u00f0\u0544\3\2\2\2\u00f2\u0548\3\2\2\2\u00f4"+ + "\u054c\3\2\2\2\u00f6\u054f\3\2\2\2\u00f8\u0551\3\2\2\2\u00fa\u0566\3\2"+ + "\2\2\u00fc\u0568\3\2\2\2\u00fe\u057e\3\2\2\2\u0100\u0586\3\2\2\2\u0102"+ + "\u0588\3\2\2\2\u0104\u059e\3\2\2\2\u0106\u05a6\3\2\2\2\u0108\u05ae\3\2"+ + "\2\2\u010a\u05b2\3\2\2\2\u010c\u05be\3\2\2\2\u010e\u05c8\3\2\2\2\u0110"+ + "\u05d3\3\2\2\2\u0112\u05db\3\2\2\2\u0114\u05df\3\2\2\2\u0116\u05e8\3\2"+ + "\2\2\u0118\u05f2\3\2\2\2\u011a\u05f7\3\2\2\2\u011c\u05f9\3\2\2\2\u011e"+ + "\u05fe\3\2\2\2\u0120\u0600\3\2\2\2\u0122\u0602\3\2\2\2\u0124\u0605\3\2"+ + "\2\2\u0126\u0609\3\2\2\2\u0128\u0614\3\2\2\2\u012a\u0618\3\2\2\2\u012c"+ + "\u061f\3\2\2\2\u012e\u0623\3\2\2\2\u0130\u0625\3\2\2\2\u0132\u0635\3\2"+ + "\2\2\u0134\u0642\3\2\2\2\u0136\u064a\3\2\2\2\u0138\u064f\3\2\2\2\u013a"+ + "\u0651\3\2\2\2\u013c\u0653\3\2\2\2\u013e\u0655\3\2\2\2\u0140\u0659\3\2"+ + "\2\2\u0142\u065c\3\2\2\2\u0144\u0665\3\2\2\2\u0146\u0670\3\2\2\2\u0148"+ + "\u0676\3\2\2\2\u014a\u067a\3\2\2\2\u014c\u067c\3\2\2\2\u014e\u068c\3\2"+ + "\2\2\u0150\u0691\3\2\2\2\u0152\u0694\3\2\2\2\u0154\u0698\3\2\2\2\u0156"+ + "\u069c\3\2\2\2\u0158\u06a1\3\2\2\2\u015a\u06b4\3\2\2\2\u015c\u06b8\3\2"+ + "\2\2\u015e\u06be\3\2\2\2\u0160\u0161\5\u0092J\2\u0161\u0162\7\2\2\3\u0162"+ + "\3\3\2\2\2\u0163\u0164\5\u0094K\2\u0164\u0165\7\2\2\3\u0165\5\3\2\2\2"+ + "\u0166\u0167\5\u00b0Y\2\u0167\u0168\7\2\2\3\u0168\7\3\2\2\2\u0169\u016e"+ + "\5\n\6\2\u016a\u016b\7l\2\2\u016b\u016d\5\n\6\2\u016c\u016a\3\2\2\2\u016d"+ + "\u0170\3\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\t\3\2\2\2"+ + "\u0170\u016e\3\2\2\2\u0171\u0173\7d\2\2\u0172\u0174\7;\2\2\u0173\u0172"+ + "\3\2\2\2\u0173\u0174\3\2\2\2\u0174\13\3\2\2\2\u0175\u0176\5\16\b\2\u0176"+ + "\u0177\5\u015e\u00b0\2\u0177\u0179\3\2\2\2\u0178\u0175\3\2\2\2\u0179\u017c"+ + "\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\3\2\2\2\u017c"+ + "\u017a\3\2\2\2\u017d\u017e\5\u00c8e\2\u017e\u0184\5\u015e\u00b0\2\u017f"+ + "\u0180\5\24\13\2\u0180\u0181\5\u015e\u00b0\2\u0181\u0183\3\2\2\2\u0182"+ + "\u017f\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2"+ + "\2\2\u0185\u0190\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u018b\5v<\2\u0188\u018b"+ + "\5\u00ccg\2\u0189\u018b\5\26\f\2\u018a\u0187\3\2\2\2\u018a\u0188\3\2\2"+ + "\2\u018a\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c\u018d\5\u015e\u00b0\2"+ + "\u018d\u018f\3\2\2\2\u018e\u018a\3\2\2\2\u018f\u0192\3\2\2\2\u0190\u018e"+ + "\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0193\3\2\2\2\u0192\u0190\3\2\2\2\u0193"+ + "\u0194\7\2\2\3\u0194\r\3\2\2\2\u0195\u0196\7D\2\2\u0196\u0197\5\u0092"+ + "J\2\u0197\17\3\2\2\2\u0198\u0199\7E\2\2\u0199\u019a\5\u0092J\2\u019a\21"+ + "\3\2\2\2\u019b\u019c\5\20\t\2\u019c\u019d\5\u015e\u00b0\2\u019d\u019f"+ + "\3\2\2\2\u019e\u019b\3\2\2\2\u019f\u01a2\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0"+ + "\u01a1\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a3\u01a5\t\2"+ + "\2\2\u01a4\u01a3\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6"+ + "\u01a7\5\u00caf\2\u01a7\23\3\2\2\2\u01a8\u01a9\5\20\t\2\u01a9\u01aa\5"+ + "\u015e\u00b0\2\u01aa\u01ac\3\2\2\2\u01ab\u01a8\3\2\2\2\u01ac\u01af\3\2"+ + "\2\2\u01ad\u01ab\3\2\2\2\u01ad\u01ae\3\2\2\2\u01ae\u01bd\3\2\2\2\u01af"+ + "\u01ad\3\2\2\2\u01b0\u01b1\7`\2\2\u01b1\u01be\5\22\n\2\u01b2\u01b3\7`"+ + "\2\2\u01b3\u01b9\7e\2\2\u01b4\u01b5\5\22\n\2\u01b5\u01b6\5\u015e\u00b0"+ + "\2\u01b6\u01b8\3\2\2\2\u01b7\u01b4\3\2\2\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7"+ + "\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01bc\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc"+ + "\u01be\7f\2\2\u01bd\u01b0\3\2\2\2\u01bd\u01b2\3\2\2\2\u01be\25\3\2\2\2"+ + "\u01bf\u01c4\5h\65\2\u01c0\u01c4\5~@\2\u01c1\u01c4\5\u0082B\2\u01c2\u01c4"+ + "\5|?\2\u01c3\u01bf\3\2\2\2\u01c3\u01c0\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c3"+ + "\u01c2\3\2\2\2\u01c4\27\3\2\2\2\u01c5\u01c6\7\34\2\2\u01c6\u01cc\5\u0094"+ + "K\2\u01c7\u01c8\t\3\2\2\u01c8\u01cc\5.\30\2\u01c9\u01ca\t\4\2\2\u01ca"+ + "\u01cc\5\u0092J\2\u01cb\u01c5\3\2\2\2\u01cb\u01c7\3\2\2\2\u01cb\u01c9"+ + "\3\2\2\2\u01cc\31\3\2\2\2\u01cd\u01ce\5\34\17\2\u01ce\33\3\2\2\2\u01cf"+ + "\u01d0\5V,\2\u01d0\u01d1\5\36\20\2\u01d1\35\3\2\2\2\u01d2\u01d3\7C\2\2"+ + "\u01d3\u01d5\7e\2\2\u01d4\u01d6\5\u00dep\2\u01d5\u01d4\3\2\2\2\u01d5\u01d6"+ + "\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7f\2\2\u01d8\37\3\2\2\2\u01d9"+ + "\u01e6\5F$\2\u01da\u01e6\5D#\2\u01db\u01e6\5B\"\2\u01dc\u01e6\5$\23\2"+ + "\u01dd\u01e6\5@!\2\u01de\u01e6\58\35\2\u01df\u01e6\5> \2\u01e0\u01e6\5"+ + "\66\34\2\u01e1\u01e6\5\62\32\2\u01e2\u01e6\5\60\31\2\u01e3\u01e6\5\64"+ + "\33\2\u01e4\u01e6\5\"\22\2\u01e5\u01d9\3\2\2\2\u01e5\u01da\3\2\2\2\u01e5"+ + "\u01db\3\2\2\2\u01e5\u01dc\3\2\2\2\u01e5\u01dd\3\2\2\2\u01e5\u01de\3\2"+ + "\2\2\u01e5\u01df\3\2\2\2\u01e5\u01e0\3\2\2\2\u01e5\u01e1\3\2\2\2\u01e5"+ + "\u01e2\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e4\3\2\2\2\u01e6!\3\2\2\2"+ + "\u01e7\u01e8\t\5\2\2\u01e8#\3\2\2\2\u01e9\u01ea\7]\2\2\u01ea\u01eb\7i"+ + "\2\2\u01eb\u01ec\5\u00b0Y\2\u01ec\u01ed\7j\2\2\u01ed%\3\2\2\2\u01ee\u01f3"+ + "\5(\25\2\u01ef\u01f0\7l\2\2\u01f0\u01f2\5(\25\2\u01f1\u01ef\3\2\2\2\u01f2"+ + "\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f7\3\2"+ + "\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7l\2\2\u01f7\u01f6\3\2\2\2\u01f7"+ + "\u01f8\3\2\2\2\u01f8\'\3\2\2\2\u01f9\u01fe\7d\2\2\u01fa\u01fb\7l\2\2\u01fb"+ + "\u01fd\7d\2\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3\2\2\2\u01fe\u01fc\3\2"+ + "\2\2\u01fe\u01ff\3\2\2\2\u01ff\u0201\3\2\2\2\u0200\u01fe\3\2\2\2\u0201"+ + "\u0202\5\u0120\u0091\2\u0202)\3\2\2\2\u0203\u0205\5,\27\2\u0204\u0203"+ + "\3\2\2\2\u0205\u0208\3\2\2\2\u0206\u0204\3\2\2\2\u0206\u0207\3\2\2\2\u0207"+ + "+\3\2\2\2\u0208\u0206\3\2\2\2\u0209\u020a\7g\2\2\u020a\u020f\5\u0092J"+ + "\2\u020b\u020c\7l\2\2\u020c\u020e\5\u0092J\2\u020d\u020b\3\2\2\2\u020e"+ + "\u0211\3\2\2\2\u020f\u020d\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0212\3\2"+ + "\2\2\u0211\u020f\3\2\2\2\u0212\u0213\7h\2\2\u0213-\3\2\2\2\u0214\u0215"+ + "\5\u00a2R\2\u0215/\3\2\2\2\u0216\u0217\7\62\2\2\u0217\u0218\7e\2\2\u0218"+ + "\u0219\5\u0092J\2\u0219\u021a\7f\2\2\u021a\61\3\2\2\2\u021b\u021c\7\66"+ + "\2\2\u021c\u021d\7i\2\2\u021d\u021e\5\u00b0Y\2\u021e\u021f\7j\2\2\u021f"+ + "\63\3\2\2\2\u0220\u0221\7\63\2\2\u0221\u0222\7e\2\2\u0222\u0223\5\u0092"+ + "J\2\u0223\u0224\7f\2\2\u0224\65\3\2\2\2\u0225\u0226\t\6\2\2\u0226\u0227"+ + "\7e\2\2\u0227\u0228\5\u0092J\2\u0228\u0229\7f\2\2\u0229\67\3\2\2\2\u022a"+ + "\u022f\7\23\2\2\u022b\u022c\7i\2\2\u022c\u022d\5:\36\2\u022d\u022e\7j"+ + "\2\2\u022e\u0230\3\2\2\2\u022f\u022b\3\2\2\2\u022f\u0230\3\2\2\2\u0230"+ + "\u0231\3\2\2\2\u0231\u0232\7e\2\2\u0232\u0233\5\u0092J\2\u0233\u0234\7"+ + "f\2\2\u02349\3\2\2\2\u0235\u0238\5<\37\2\u0236\u0238\7\25\2\2\u0237\u0235"+ + "\3\2\2\2\u0237\u0236\3\2\2\2\u0238;\3\2\2\2\u0239\u023a\7d\2\2\u023a="+ + "\3\2\2\2\u023b\u023c\7\24\2\2\u023c\u023d\7e\2\2\u023d\u023e\5\u0092J"+ + "\2\u023e\u023f\7f\2\2\u023f?\3\2\2\2\u0240\u0241\79\2\2\u0241\u0242\7"+ + "e\2\2\u0242\u0243\5\u0092J\2\u0243\u0244\7f\2\2\u0244A\3\2\2\2\u0245\u0246"+ + "\78\2\2\u0246\u0247\7e\2\2\u0247\u0248\5\u0092J\2\u0248\u0249\7f\2\2\u0249"+ + "C\3\2\2\2\u024a\u024b\7\30\2\2\u024b\u024c\7e\2\2\u024c\u024f\5\u0092"+ + "J\2\u024d\u024e\7l\2\2\u024e\u0250\5\u0092J\2\u024f\u024d\3\2\2\2\u024f"+ + "\u0250\3\2\2\2\u0250\u0251\3\2\2\2\u0251\u0252\7f\2\2\u0252E\3\2\2\2\u0253"+ + "\u0254\t\6\2\2\u0254\u0255\7i\2\2\u0255\u0256\5\u0092J\2\u0256\u0257\7"+ + "<\2\2\u0257\u0258\5\u0092J\2\u0258\u0259\7j\2\2\u0259G\3\2\2\2\u025a\u025b"+ + "\7i\2\2\u025b\u0260\5J&\2\u025c\u025d\7l\2\2\u025d\u025f\5J&\2\u025e\u025c"+ + "\3\2\2\2\u025f\u0262\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261"+ + "\u0263\3\2\2\2\u0262\u0260\3\2\2\2\u0263\u0264\7j\2\2\u0264I\3\2\2\2\u0265"+ + "\u0266\5\u0092J\2\u0266\u0267\7k\2\2\u0267\u0268\5\u0092J\2\u0268K\3\2"+ + "\2\2\u0269\u026d\5T+\2\u026a\u026d\5R*\2\u026b\u026d\5N(\2\u026c\u0269"+ + "\3\2\2\2\u026c\u026a\3\2\2\2\u026c\u026b\3\2\2\2\u026dM\3\2\2\2\u026e"+ + "\u026f\7\64\2\2\u026f\u0275\7g\2\2\u0270\u0271\5P)\2\u0271\u0272\5\u015e"+ + "\u00b0\2\u0272\u0274\3\2\2\2\u0273\u0270\3\2\2\2\u0274\u0277\3\2\2\2\u0275"+ + "\u0273\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0278\3\2\2\2\u0277\u0275\3\2"+ + "\2\2\u0278\u0279\7h\2\2\u0279O\3\2\2\2\u027a\u027b\7L\2\2\u027b\u027c"+ + "\7d\2\2\u027c\u0284\5\u012c\u0097\2\u027d\u027e\7\65\2\2\u027e\u027f\7"+ + "g\2\2\u027f\u0280\5\u0092J\2\u0280\u0281\5\u015e\u00b0\2\u0281\u0282\7"+ + "h\2\2\u0282\u0284\3\2\2\2\u0283\u027a\3\2\2\2\u0283\u027d\3\2\2\2\u0284"+ + "Q\3\2\2\2\u0285\u0286\7\34\2\2\u0286\u0287\7i\2\2\u0287\u0288\7j\2\2\u0288"+ + "\u0289\5\u0120\u0091\2\u0289S\3\2\2\2\u028a\u028b\t\7\2\2\u028b\u028c"+ + "\7i\2\2\u028c\u028d\5\u00b0Y\2\u028d\u028e\7j\2\2\u028e\u0296\3\2\2\2"+ + "\u028f\u0290\7,\2\2\u0290\u0291\7i\2\2\u0291\u0292\5\u00b0Y\2\u0292\u0293"+ + "\7j\2\2\u0293\u0294\5\u00b0Y\2\u0294\u0296\3\2\2\2\u0295\u028a\3\2\2\2"+ + "\u0295\u028f\3\2\2\2\u0296U\3\2\2\2\u0297\u029d\5X-\2\u0298\u0299\7\20"+ + "\2\2\u0299\u029d\b,\1\2\u029a\u029b\7B\2\2\u029b\u029d\b,\1\2\u029c\u0297"+ + "\3\2\2\2\u029c\u0298\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029e\3\2\2\2\u029e"+ + "\u02a0\5\u015e\u00b0\2\u029f\u029c\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u02a2"+ + "\3\2\2\2\u02a1\u029f\3\2\2\2\u02a2\u02a6\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4"+ + "\u02a5\7\20\2\2\u02a5\u02a7\b,\1\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2"+ + "\2\2\u02a7W\3\2\2\2\u02a8\u02a9\7\13\2\2\u02a9\u02b1\5\\/\2\u02aa\u02ab"+ + "\7\f\2\2\u02ab\u02b1\5\\/\2\u02ac\u02ad\7\r\2\2\u02ad\u02b1\5\\/\2\u02ae"+ + "\u02af\7\17\2\2\u02af\u02b1\5Z.\2\u02b0\u02a8\3\2\2\2\u02b0\u02aa\3\2"+ + "\2\2\u02b0\u02ac\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b1Y\3\2\2\2\u02b2\u02b4"+ + "\5\u00d4k\2\u02b3\u02b2\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b7\3\2\2"+ + "\2\u02b5\u02b6\7[\2\2\u02b6\u02b8\5\u0092J\2\u02b7\u02b5\3\2\2\2\u02b7"+ + "\u02b8\3\2\2\2\u02b8[\3\2\2\2\u02b9\u02bc\3\2\2\2\u02ba\u02bc\5\u0092"+ + "J\2\u02bb\u02b9\3\2\2\2\u02bb\u02ba\3\2\2\2\u02bc]\3\2\2\2\u02bd\u02c2"+ + "\7g\2\2\u02be\u02bf\7:\2\2\u02bf\u02c0\5\u00d2j\2\u02c0\u02c1\5\u015e"+ + "\u00b0\2\u02c1\u02c3\3\2\2\2\u02c2\u02be\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3"+ + "\u02c5\3\2\2\2\u02c4\u02c6\5\u00dep\2\u02c5\u02c4\3\2\2\2\u02c5\u02c6"+ + "\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c8\7h\2\2\u02c8_\3\2\2\2\u02c9\u02cc"+ + "\5\u013e\u00a0\2\u02ca\u02cc\7d\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02ca\3"+ + "\2\2\2\u02cc\u02d5\3\2\2\2\u02cd\u02d2\7g\2\2\u02ce\u02d0\5b\62\2\u02cf"+ + "\u02d1\7l\2\2\u02d0\u02cf\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2"+ + "\2\2\u02d2\u02ce\3\2\2\2\u02d2\u02d3\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4"+ + "\u02d6\7h\2\2\u02d5\u02cd\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6a\3\2\2\2\u02d7"+ + "\u02dc\5d\63\2\u02d8\u02d9\7l\2\2\u02d9\u02db\5d\63\2\u02da\u02d8\3\2"+ + "\2\2\u02db\u02de\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2\2\2\u02dd"+ + "c\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e0\7d\2\2\u02e0\u02e2\7n\2\2\u02e1"+ + "\u02df\3\2\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3\u02e4\5\u0092"+ + "J\2\u02e4e\3\2\2\2\u02e5\u02e6\7F\2\2\u02e6\u02e7\5\u0092J\2\u02e7\u02e8"+ + "\7\21\2\2\u02e8\u02e9\5`\61\2\u02e9\u02ea\5\u00dco\2\u02eag\3\2\2\2\u02eb"+ + "\u02ec\5\u00b0Y\2\u02ec\u02ed\7\21\2\2\u02ed\u0300\5\u00b0Y\2\u02ee\u02f4"+ + "\7g\2\2\u02ef\u02f0\5p9\2\u02f0\u02f1\5\u015e\u00b0\2\u02f1\u02f3\3\2"+ + "\2\2\u02f2\u02ef\3\2\2\2\u02f3\u02f6\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f4"+ + "\u02f5\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f7\u02f8\5j"+ + "\66\2\u02f8\u02f9\5\u015e\u00b0\2\u02f9\u02fb\3\2\2\2\u02fa\u02f7\3\2"+ + "\2\2\u02fb\u02fe\3\2\2\2\u02fc\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd"+ + "\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff\u0301\7h\2\2\u0300\u02ee\3\2"+ + "\2\2\u0300\u0301\3\2\2\2\u0301i\3\2\2\2\u0302\u0304\7\20\2\2\u0303\u0302"+ + "\3\2\2\2\u0303\u0304\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0306\5l\67\2\u0306"+ + "\u0307\7d\2\2\u0307\u0309\5\u012c\u0097\2\u0308\u030a\5\u00dco\2\u0309"+ + "\u0308\3\2\2\2\u0309\u030a\3\2\2\2\u030ak\3\2\2\2\u030b\u030d\7e\2\2\u030c"+ + "\u030e\7d\2\2\u030d\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0310\3\2"+ + "\2\2\u030f\u0311\7\u0086\2\2\u0310\u030f\3\2\2\2\u0310\u0311\3\2\2\2\u0311"+ + "\u0312\3\2\2\2\u0312\u0313\5\u011a\u008e\2\u0313\u0314\7f\2\2\u0314m\3"+ + "\2\2\2\u0315\u031b\5\u00a2R\2\u0316\u0317\5\u00b0Y\2\u0317\u0318\7o\2"+ + "\2\u0318\u0319\7d\2\2\u0319\u031b\3\2\2\2\u031a\u0315\3\2\2\2\u031a\u0316"+ + "\3\2\2\2\u031bo\3\2\2\2\u031c\u031d\7\67\2\2\u031d\u031e\7d\2\2\u031e"+ + "\u0321\7r\2\2\u031f\u0322\5n8\2\u0320\u0322\5\u013c\u009f\2\u0321\u031f"+ + "\3\2\2\2\u0321\u0320\3\2\2\2\u0322q\3\2\2\2\u0323\u0324\7\60\2\2\u0324"+ + "\u0325\7e\2\2\u0325\u0328\5\u00b0Y\2\u0326\u0327\7l\2\2\u0327\u0329\5"+ + "\u00d4k\2\u0328\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u032a\3\2\2\2"+ + "\u032a\u032b\7f\2\2\u032bs\3\2\2\2\u032c\u032d\7/\2\2\u032d\u032e\7e\2"+ + "\2\u032e\u032f\5\u00b0Y\2\u032f\u0330\7f\2\2\u0330u\3\2\2\2\u0331\u0334"+ + "\5V,\2\u0332\u0335\5x=\2\u0333\u0335\5z>\2\u0334\u0332\3\2\2\2\u0334\u0333"+ + "\3\2\2\2\u0335w\3\2\2\2\u0336\u0337\7L\2\2\u0337\u0338\7d\2\2\u0338\u033a"+ + "\5\u012c\u0097\2\u0339\u033b\5^\60\2\u033a\u0339\3\2\2\2\u033a\u033b\3"+ + "\2\2\2\u033by\3\2\2\2\u033c\u033d\7L\2\2\u033d\u033e\5\u0088E\2\u033e"+ + "\u033f\7d\2\2\u033f\u0341\5\u012c\u0097\2\u0340\u0342\5^\60\2\u0341\u0340"+ + "\3\2\2\2\u0341\u0342\3\2\2\2\u0342{\3\2\2\2\u0343\u0346\7\34\2\2\u0344"+ + "\u0347\5v<\2\u0345\u0347\5\u00ccg\2\u0346\u0344\3\2\2\2\u0346\u0345\3"+ + "\2\2\2\u0347}\3\2\2\2\u0348\u0349\7\67\2\2\u0349\u034a\7d\2\2\u034a\u034c"+ + "\5\u0130\u0099\2\u034b\u034d\5\u0080A\2\u034c\u034b\3\2\2\2\u034c\u034d"+ + "\3\2\2\2\u034d\177\3\2\2\2\u034e\u034f\7g\2\2\u034f\u0350\5\u0092J\2\u0350"+ + "\u0351\5\u015e\u00b0\2\u0351\u0352\7h\2\2\u0352\u0081\3\2\2\2\u0353\u0354"+ + "\7\67\2\2\u0354\u0355\5\u0088E\2\u0355\u0356\7d\2\2\u0356\u0358\5\u0130"+ + "\u0099\2\u0357\u0359\5\u0080A\2\u0358\u0357\3\2\2\2\u0358\u0359\3\2\2"+ + "\2\u0359\u0083\3\2\2\2\u035a\u0362\5\b\5\2\u035b\u035e\5\u00b0Y\2\u035c"+ + "\u035d\7k\2\2\u035d\u035f\5\u00d4k\2\u035e\u035c\3\2\2\2\u035e\u035f\3"+ + "\2\2\2\u035f\u0363\3\2\2\2\u0360\u0361\7k\2\2\u0361\u0363\5\u00d4k\2\u0362"+ + "\u035b\3\2\2\2\u0362\u0360\3\2\2\2\u0363\u0085\3\2\2\2\u0364\u0365\5\b"+ + "\5\2\u0365\u0366\7r\2\2\u0366\u0367\5\u00d4k\2\u0367\u0087\3\2\2\2\u0368"+ + "\u036a\7e\2\2\u0369\u036b\5\n\6\2\u036a\u0369\3\2\2\2\u036a\u036b\3\2"+ + "\2\2\u036b\u036c\3\2\2\2\u036c\u036e\5\u00b0Y\2\u036d\u036f\7l\2\2\u036e"+ + "\u036d\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u0370\3\2\2\2\u0370\u0371\7f"+ + "\2\2\u0371\u0089\3\2\2\2\u0372\u0375\5\u008cG\2\u0373\u0375\5\u008eH\2"+ + "\u0374\u0372\3\2\2\2\u0374\u0373\3\2\2\2\u0375\u008b\3\2\2\2\u0376\u0378"+ + "\5\u00d2j\2\u0377\u0376\3\2\2\2\u0377\u0378\3\2\2\2\u0378\u0379\3\2\2"+ + "\2\u0379\u037a\5\u0090I\2\u037a\u008d\3\2\2\2\u037b\u037d\7\34\2\2\u037c"+ + "\u037e\5\u00d2j\2\u037d\u037c\3\2\2\2\u037d\u037e\3\2\2\2\u037e\u037f"+ + "\3\2\2\2\u037f\u0380\5\u0090I\2\u0380\u008f\3\2\2\2\u0381\u0383\7s\2\2"+ + "\u0382\u0381\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u0385"+ + "\5\u00b0Y\2\u0385\u0091\3\2\2\2\u0386\u0387\bJ\1\2\u0387\u0388\t\b\2\2"+ + "\u0388\u0397\5\u0092J\20\u0389\u0397\5\u00a2R\2\u038a\u038b\7\33\2\2\u038b"+ + "\u038c\5.\30\2\u038c\u038d\7\35\2\2\u038d\u038e\5\u0092J\4\u038e\u0397"+ + "\3\2\2\2\u038f\u0390\t\t\2\2\u0390\u0391\5&\24\2\u0391\u0392\7n\2\2\u0392"+ + "\u0393\7n\2\2\u0393\u0394\5*\26\2\u0394\u0395\5\u0092J\3\u0395\u0397\3"+ + "\2\2\2\u0396\u0386\3\2\2\2\u0396\u0389\3\2\2\2\u0396\u038a\3\2\2\2\u0396"+ + "\u038f\3\2\2\2\u0397\u03bb\3\2\2\2\u0398\u0399\f\16\2\2\u0399\u039a\t"+ + "\n\2\2\u039a\u03ba\5\u0092J\17\u039b\u039c\f\r\2\2\u039c\u039d\t\13\2"+ + "\2\u039d\u03ba\5\u0092J\16\u039e\u039f\f\f\2\2\u039f\u03a0\t\f\2\2\u03a0"+ + "\u03ba\5\u0092J\r\u03a1\u03a2\f\13\2\2\u03a2\u03a3\t\r\2\2\u03a3\u03ba"+ + "\5\u0092J\f\u03a4\u03a5\f\n\2\2\u03a5\u03a6\t\16\2\2\u03a6\u03ba\5\u0092"+ + "J\13\u03a7\u03a8\f\b\2\2\u03a8\u03a9\7u\2\2\u03a9\u03ba\5\u0092J\t\u03aa"+ + "\u03ab\f\7\2\2\u03ab\u03ac\7t\2\2\u03ac\u03ba\5\u0092J\b\u03ad\u03ae\f"+ + "\6\2\2\u03ae\u03af\7#\2\2\u03af\u03ba\5\u0092J\6\u03b0\u03b1\f\5\2\2\u03b1"+ + "\u03b2\7&\2\2\u03b2\u03b3\5\u0092J\2\u03b3\u03b4\7n\2\2\u03b4\u03b5\5"+ + "\u0092J\5\u03b5\u03ba\3\2\2\2\u03b6\u03b7\f\t\2\2\u03b7\u03b8\7\21\2\2"+ + "\u03b8\u03ba\5`\61\2\u03b9\u0398\3\2\2\2\u03b9\u039b\3\2\2\2\u03b9\u039e"+ + "\3\2\2\2\u03b9\u03a1\3\2\2\2\u03b9\u03a4\3\2\2\2\u03b9\u03a7\3\2\2\2\u03b9"+ + "\u03aa\3\2\2\2\u03b9\u03ad\3\2\2\2\u03b9\u03b0\3\2\2\2\u03b9\u03b6\3\2"+ + "\2\2\u03ba\u03bd\3\2\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc"+ + "\u0093\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03d3\5\30\r\2\u03bf\u03d3\5"+ + "\32\16\2\u03c0\u03d3\5\u0098M\2\u03c1\u03d3\5\u0096L\2\u03c2\u03d3\5\u00cc"+ + "g\2\u03c3\u03d3\5\u00ecw\2\u03c4\u03d3\5\u00e0q\2\u03c5\u03d3\5\u0118"+ + "\u008d\2\u03c6\u03d3\5\u00eex\2\u03c7\u03d3\5\u00f0y\2\u03c8\u03d3\5\u00f2"+ + "z\2\u03c9\u03d3\5\u00f4{\2\u03ca\u03d3\5\u00f6|\2\u03cb\u03d3\5\u00dc"+ + "o\2\u03cc\u03d3\5\u00f8}\2\u03cd\u03d3\5\u00fa~\2\u03ce\u03d3\5\u010c"+ + "\u0087\2\u03cf\u03d3\5\u009aN\2\u03d0\u03d3\5\u009eP\2\u03d1\u03d3\5f"+ + "\64\2\u03d2\u03be\3\2\2\2\u03d2\u03bf\3\2\2\2\u03d2\u03c0\3\2\2\2\u03d2"+ + "\u03c1\3\2\2\2\u03d2\u03c2\3\2\2\2\u03d2\u03c3\3\2\2\2\u03d2\u03c4\3\2"+ + "\2\2\u03d2\u03c5\3\2\2\2\u03d2\u03c6\3\2\2\2\u03d2\u03c7\3\2\2\2\u03d2"+ + "\u03c8\3\2\2\2\u03d2\u03c9\3\2\2\2\u03d2\u03ca\3\2\2\2\u03d2\u03cb\3\2"+ + "\2\2\u03d2\u03cc\3\2\2\2\u03d2\u03cd\3\2\2\2\u03d2\u03ce\3\2\2\2\u03d2"+ + "\u03cf\3\2\2\2\u03d2\u03d0\3\2\2\2\u03d2\u03d1\3\2\2\2\u03d3\u0095\3\2"+ + "\2\2\u03d4\u03d5\7%\2\2\u03d5\u03d6\5\u0092J\2\u03d6\u0097\3\2\2\2\u03d7"+ + "\u03d8\7W\2\2\u03d8\u03da\5\u0092J\2\u03d9\u03db\5\u00dco\2\u03da\u03d9"+ + "\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u0099\3\2\2\2\u03dc\u03dd\5\u009cO"+ + "\2\u03dd\u03de\5\u0114\u008b\2\u03de\u009b\3\2\2\2\u03df\u03e0\7\16\2"+ + "\2\u03e0\u03e1\5\u0092J\2\u03e1\u03e2\5\u015e\u00b0\2\u03e2\u03e4\3\2"+ + "\2\2\u03e3\u03df\3\2\2\2\u03e4\u03e7\3\2\2\2\u03e5\u03e3\3\2\2\2\u03e5"+ + "\u03e6\3\2\2\2\u03e6\u03ec\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e8\u03e9\7\17"+ + "\2\2\u03e9\u03ea\5Z.\2\u03ea\u03eb\5\u015e\u00b0\2\u03eb\u03ed\3\2\2\2"+ + "\u03ec\u03e8\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009d\3\2\2\2\u03ee\u03ef"+ + "\7P\2\2\u03ef\u03f4\5\u0092J\2\u03f0\u03f1\7P\2\2\u03f1\u03f2\t\3\2\2"+ + "\u03f2\u03f4\5.\30\2\u03f3\u03ee\3\2\2\2\u03f3\u03f0\3\2\2\2\u03f4\u009f"+ + "\3\2\2\2\u03f5\u03fe\7\5\2\2\u03f6\u03fe\7\6\2\2\u03f7\u03fe\7c\2\2\u03f8"+ + "\u03fe\5\u013a\u009e\2\u03f9\u03fe\5\u0150\u00a9\2\u03fa\u03fe\7\3\2\2"+ + "\u03fb\u03fe\7\u008e\2\2\u03fc\u03fe\7\u008f\2\2\u03fd\u03f5\3\2\2\2\u03fd"+ + "\u03f6\3\2\2\2\u03fd\u03f7\3\2\2\2\u03fd\u03f8\3\2\2\2\u03fd\u03f9\3\2"+ + "\2\2\u03fd\u03fa\3\2\2\2\u03fd\u03fb\3\2\2\2\u03fd\u03fc\3\2\2\2\u03fe"+ + "\u00a1\3\2\2\2\u03ff\u0400\bR\1\2\u0400\u040c\5\u0136\u009c\2\u0401\u040c"+ + "\5\u0132\u009a\2\u0402\u040c\5\u015a\u00ae\2\u0403\u040c\5 \21\2\u0404"+ + "\u040c\5t;\2\u0405\u040c\5r:\2\u0406\u0407\t\17\2\2\u0407\u0408\7e\2\2"+ + "\u0408\u0409\5\u0092J\2\u0409\u040a\7f\2\2\u040a\u040c\3\2\2\2\u040b\u03ff"+ + "\3\2\2\2\u040b\u0401\3\2\2\2\u040b\u0402\3\2\2\2\u040b\u0403\3\2\2\2\u040b"+ + "\u0404\3\2\2\2\u040b\u0405\3\2\2\2\u040b\u0406\3\2\2\2\u040c\u0423\3\2"+ + "\2\2\u040d\u040e\f\13\2\2\u040e\u040f\7o\2\2\u040f\u0422\7d\2\2\u0410"+ + "\u0411\f\n\2\2\u0411\u0422\5\u0154\u00ab\2\u0412\u0413\f\t\2\2\u0413\u0422"+ + "\5\u00bc_\2\u0414\u0415\f\b\2\2\u0415\u0422\5H%\2\u0416\u0417\f\7\2\2"+ + "\u0417\u0422\5\u0156\u00ac\2\u0418\u0419\f\6\2\2\u0419\u0422\5\u0158\u00ad"+ + "\2\u041a\u041b\f\5\2\2\u041b\u041c\5\u0158\u00ad\2\u041c\u041d\7\22\2"+ + "\2\u041d\u041e\5`\61\2\u041e\u0422\3\2\2\2\u041f\u0420\f\4\2\2\u0420\u0422"+ + "\5\u00a8U\2\u0421\u040d\3\2\2\2\u0421\u0410\3\2\2\2\u0421\u0412\3\2\2"+ + "\2\u0421\u0414\3\2\2\2\u0421\u0416\3\2\2\2\u0421\u0418\3\2\2\2\u0421\u041a"+ + "\3\2\2\2\u0421\u041f\3\2\2\2\u0422\u0425\3\2\2\2\u0423\u0421\3\2\2\2\u0423"+ + "\u0424\3\2\2\2\u0424\u00a3\3\2\2\2\u0425\u0423\3\2\2\2\u0426\u0427\5V"+ + ",\2\u0427\u0428\5\u00a6T\2\u0428\u00a5\3\2\2\2\u0429\u042b\7L\2\2\u042a"+ + "\u042c\7d\2\2\u042b\u042a\3\2\2\2\u042b\u042c\3\2\2\2\u042c\u042d\3\2"+ + "\2\2\u042d\u042f\5\u012c\u0097\2\u042e\u0430\5^\60\2\u042f\u042e\3\2\2"+ + "\2\u042f\u0430\3\2\2\2\u0430\u00a7\3\2\2\2\u0431\u0433\7\'\2\2\u0432\u0434"+ + "\5\u00d4k\2\u0433\u0432\3\2\2\2\u0433\u0434\3\2\2\2\u0434\u0436\3\2\2"+ + "\2\u0435\u0437\7l\2\2\u0436\u0435\3\2\2\2\u0436\u0437\3\2\2\2\u0437\u0438"+ + "\3\2\2\2\u0438\u0439\7(\2\2\u0439\u00a9\3\2\2\2\u043a\u043b\7M\2\2\u043b"+ + "\u0445\7g\2\2\u043c\u0440\5\u00aeX\2\u043d\u0440\5\u011a\u008e\2\u043e"+ + "\u0440\5\u00acW\2\u043f\u043c\3\2\2\2\u043f\u043d\3\2\2\2\u043f\u043e"+ + "\3\2\2\2\u0440\u0441\3\2\2\2\u0441\u0442\5\u015e\u00b0\2\u0442\u0444\3"+ + "\2\2\2\u0443\u043f\3\2\2\2\u0444\u0447\3\2\2\2\u0445\u0443\3\2\2\2\u0445"+ + "\u0446\3\2\2\2\u0446\u0448\3\2\2\2\u0447\u0445\3\2\2\2\u0448\u0449\7h"+ + "\2\2\u0449\u00ab\3\2\2\2\u044a\u044b\7\67\2\2\u044b\u044c\7d\2\2\u044c"+ + "\u044d\5\u0130\u0099\2\u044d\u00ad\3\2\2\2\u044e\u0450\7\34\2\2\u044f"+ + "\u044e\3\2\2\2\u044f\u0450\3\2\2\2\u0450\u0451\3\2\2\2\u0451\u0452\5V"+ + ",\2\u0452\u0453\7d\2\2\u0453\u0454\5\u0130\u0099\2\u0454\u0455\5\u012e"+ + "\u0098\2\u0455\u045e\3\2\2\2\u0456\u0458\7\34\2\2\u0457\u0456\3\2\2\2"+ + "\u0457\u0458\3\2\2\2\u0458\u0459\3\2\2\2\u0459\u045a\5V,\2\u045a\u045b"+ + "\7d\2\2\u045b\u045c\5\u0130\u0099\2\u045c\u045e\3\2\2\2\u045d\u044f\3"+ + "\2\2\2\u045d\u0457\3\2\2\2\u045e\u00af\3\2\2\2\u045f\u0467\5\u011a\u008e"+ + "\2\u0460\u0467\5\u00b2Z\2\u0461\u0467\5L\'\2\u0462\u0463\7e\2\2\u0463"+ + "\u0464\5\u00b0Y\2\u0464\u0465\7f\2\2\u0465\u0467\3\2\2\2\u0466\u045f\3"+ + "\2\2\2\u0466\u0460\3\2\2\2\u0466\u0461\3\2\2\2\u0466\u0462\3\2\2\2\u0467"+ + "\u00b1\3\2\2\2\u0468\u0472\5\u011c\u008f\2\u0469\u0472\5\u014c\u00a7\2"+ + "\u046a\u0472\5\u0122\u0092\2\u046b\u0472\5\u012a\u0096\2\u046c\u0472\5"+ + "\u00aaV\2\u046d\u0472\5\u0124\u0093\2\u046e\u0472\5\u0126\u0094\2\u046f"+ + "\u0472\5\u0128\u0095\2\u0470\u0472\5\u00b4[\2\u0471\u0468\3\2\2\2\u0471"+ + "\u0469\3\2\2\2\u0471\u046a\3\2\2\2\u0471\u046b\3\2\2\2\u0471\u046c\3\2"+ + "\2\2\u0471\u046d\3\2\2\2\u0471\u046e\3\2\2\2\u0471\u046f\3\2\2\2\u0471"+ + "\u0470\3\2\2\2\u0472\u00b3\3\2\2\2\u0473\u0474\7\67\2\2\u0474\u0475\5"+ + "\u00b6\\\2\u0475\u00b5\3\2\2\2\u0476\u0482\7e\2\2\u0477\u047c\5\u00b0"+ + "Y\2\u0478\u0479\7l\2\2\u0479\u047b\5\u00b0Y\2\u047a\u0478\3\2\2\2\u047b"+ + "\u047e\3\2\2\2\u047c\u047a\3\2\2\2\u047c\u047d\3\2\2\2\u047d\u0480\3\2"+ + "\2\2\u047e\u047c\3\2\2\2\u047f\u0481\7l\2\2\u0480\u047f\3\2\2\2\u0480"+ + "\u0481\3\2\2\2\u0481\u0483\3\2\2\2\u0482\u0477\3\2\2\2\u0482\u0483\3\2"+ + "\2\2\u0483\u0484\3\2\2\2\u0484\u0485\7f\2\2\u0485\u00b7\3\2\2\2\u0486"+ + "\u048e\5\u014c\u00a7\2\u0487\u048e\5\u011c\u008f\2\u0488\u048e\5\u00ba"+ + "^\2\u0489\u048e\5\u0124\u0093\2\u048a\u048e\5\u0126\u0094\2\u048b\u048e"+ + "\5L\'\2\u048c\u048e\5\u011a\u008e\2\u048d\u0486\3\2\2\2\u048d\u0487\3"+ + "\2\2\2\u048d\u0488\3\2\2\2\u048d\u0489\3\2\2\2\u048d\u048a\3\2\2\2\u048d"+ + "\u048b\3\2\2\2\u048d\u048c\3\2\2\2\u048e\u00b9\3\2\2\2\u048f\u0490\7i"+ + "\2\2\u0490\u0491\7s\2\2\u0491\u0492\7j\2\2\u0492\u0493\5\u0120\u0091\2"+ + "\u0493\u00bb\3\2\2\2\u0494\u04a4\7i\2\2\u0495\u0497\5\u00be`\2\u0496\u0495"+ + "\3\2\2\2\u0496\u0497\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u049a\7n\2\2\u0499"+ "\u049b\5\u00c0a\2\u049a\u0499\3\2\2\2\u049a\u049b\3\2\2\2\u049b\u04a5"+ "\3\2\2\2\u049c\u049e\5\u00be`\2\u049d\u049c\3\2\2\2\u049d\u049e\3\2\2"+ - "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7m\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+ - "\u04a2\7m\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+ - "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7i\2\2\u04a7"+ + "\2\u049e\u049f\3\2\2\2\u049f\u04a0\7n\2\2\u04a0\u04a1\5\u00c0a\2\u04a1"+ + "\u04a2\7n\2\2\u04a2\u04a3\5\u00c2b\2\u04a3\u04a5\3\2\2\2\u04a4\u0496\3"+ + "\2\2\2\u04a4\u049d\3\2\2\2\u04a5\u04a6\3\2\2\2\u04a6\u04a7\7j\2\2\u04a7"+ "\u00bd\3\2\2\2\u04a8\u04a9\5\u0092J\2\u04a9\u00bf\3\2\2\2\u04aa\u04ab"+ "\5\u0092J\2\u04ab\u00c1\3\2\2\2\u04ac\u04ad\5\u0092J\2\u04ad\u00c3\3\2"+ "\2\2\u04ae\u04b0\t\20\2\2\u04af\u04ae\3\2\2\2\u04af\u04b0\3\2\2\2\u04b0"+ - "\u04b1\3\2\2\2\u04b1\u04b2\7j\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\7V\2"+ - "\2\u04b4\u04b5\7c\2\2\u04b5\u00c7\3\2\2\2\u04b6\u04b7\5\u0150\u00a9\2"+ - "\u04b7\u00c9\3\2\2\2\u04b8\u04bc\5\u00ccg\2\u04b9\u04bc\5\u00d4k\2\u04ba"+ - "\u04bc\5\u00d8m\2\u04bb\u04b8\3\2\2\2\u04bb\u04b9\3\2\2\2\u04bb\u04ba"+ - "\3\2\2\2\u04bc\u00cb\3\2\2\2\u04bd\u04c9\7X\2\2\u04be\u04ca\5\u00ceh\2"+ - "\u04bf\u04c5\7d\2\2\u04c0\u04c1\5\u00ceh\2\u04c1\u04c2\5\u015e\u00b0\2"+ - "\u04c2\u04c4\3\2\2\2\u04c3\u04c0\3\2\2\2\u04c4\u04c7\3\2\2\2\u04c5\u04c3"+ - "\3\2\2\2\u04c5\u04c6\3\2\2\2\u04c6\u04c8\3\2\2\2\u04c7\u04c5\3\2\2\2\u04c8"+ - "\u04ca\7e\2\2\u04c9\u04be\3\2\2\2\u04c9\u04bf\3\2\2\2\u04ca\u00cd\3\2"+ - "\2\2\u04cb\u04d1\5\u00d0i\2\u04cc\u04ce\5\u00b0Y\2\u04cd\u04cc\3\2\2\2"+ - "\u04cd\u04ce\3\2\2\2\u04ce\u04cf\3\2\2\2\u04cf\u04d0\7j\2\2\u04d0\u04d2"+ - "\5\u00d2j\2\u04d1\u04cd\3\2\2\2\u04d1\u04d2\3\2\2\2\u04d2\u00cf\3\2\2"+ - "\2\u04d3\u04d8\7c\2\2\u04d4\u04d5\7k\2\2\u04d5\u04d7\7c\2\2\u04d6\u04d4"+ - "\3\2\2\2\u04d7\u04da\3\2\2\2\u04d8\u04d6\3\2\2\2\u04d8\u04d9\3\2\2\2\u04d9"+ - "\u00d1\3\2\2\2\u04da\u04d8\3\2\2\2\u04db\u04e0\5\u0092J\2\u04dc\u04dd"+ - "\7k\2\2\u04dd\u04df\5\u0092J\2\u04de\u04dc\3\2\2\2\u04df\u04e2\3\2\2\2"+ - "\u04e0\u04de\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1\u00d3\3\2\2\2\u04e2\u04e0"+ - "\3\2\2\2\u04e3\u04ef\7\\\2\2\u04e4\u04f0\5\u00d6l\2\u04e5\u04eb\7d\2\2"+ - "\u04e6\u04e7\5\u00d6l\2\u04e7\u04e8\5\u015e\u00b0\2\u04e8\u04ea\3\2\2"+ - "\2\u04e9\u04e6\3\2\2\2\u04ea\u04ed\3\2\2\2\u04eb\u04e9\3\2\2\2\u04eb\u04ec"+ - "\3\2\2\2\u04ec\u04ee\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ee\u04f0\7e\2\2\u04ef"+ - "\u04e4\3\2\2\2\u04ef\u04e5\3\2\2\2\u04f0\u00d5\3\2\2\2\u04f1\u04f3\7c"+ - "\2\2\u04f2\u04f4\7j\2\2\u04f3\u04f2\3\2\2\2\u04f3\u04f4\3\2\2\2\u04f4"+ - "\u04f5\3\2\2\2\u04f5\u04f6\5\u00b0Y\2\u04f6\u00d7\3\2\2\2\u04f7\u0503"+ - "\7a\2\2\u04f8\u0504\5\u0084C\2\u04f9\u04ff\7d\2\2\u04fa\u04fb\5\u0084"+ - "C\2\u04fb\u04fc\5\u015e\u00b0\2\u04fc\u04fe\3\2\2\2\u04fd\u04fa\3\2\2"+ - "\2\u04fe\u0501\3\2\2\2\u04ff\u04fd\3\2\2\2\u04ff\u0500\3\2\2\2\u0500\u0502"+ - "\3\2\2\2\u0501\u04ff\3\2\2\2\u0502\u0504\7e\2\2\u0503\u04f8\3\2\2\2\u0503"+ - "\u04f9\3\2\2\2\u0504\u00d9\3\2\2\2\u0505\u0507\7f\2\2\u0506\u0508\5\u00dc"+ - "o\2\u0507\u0506\3\2\2\2\u0507\u0508\3\2\2\2\u0508\u0509\3\2\2\2\u0509"+ - "\u050a\7g\2\2\u050a\u00db\3\2\2\2\u050b\u050d\5\u015e\u00b0\2\u050c\u050b"+ - "\3\2\2\2\u050c\u050d\3\2\2\2\u050d\u050e\3\2\2\2\u050e\u050f\5\u0094K"+ - "\2\u050f\u0510\5\u015e\u00b0\2\u0510\u0512\3\2\2\2\u0511\u050c\3\2\2\2"+ - "\u0512\u0513\3\2\2\2\u0513\u0511\3\2\2\2\u0513\u0514\3\2\2\2\u0514\u00dd"+ - "\3\2\2\2\u0515\u051b\5\u00e2r\2\u0516\u051b\5\u00e4s\2\u0517\u051b\5\u00e6"+ - "t\2\u0518\u051b\5\u00e0q\2\u0519\u051b\5\u0086D\2\u051a\u0515\3\2\2\2"+ - "\u051a\u0516\3\2\2\2\u051a\u0517\3\2\2\2\u051a\u0518\3\2\2\2\u051a\u0519"+ - "\3\2\2\2\u051b\u00df\3\2\2\2\u051c\u051d\5\u0092J\2\u051d\u00e1\3\2\2"+ - "\2\u051e\u051f\5\u0092J\2\u051f\u0520\7\u0087\2\2\u0520\u0521\5\u0092"+ - "J\2\u0521\u00e3\3\2\2\2\u0522\u0523\5\u0092J\2\u0523\u0524\t\21\2\2\u0524"+ - "\u00e5\3\2\2\2\u0525\u0526\5\u00d2j\2\u0526\u0527\5\u00c4c\2\u0527\u0528"+ - "\5\u00d2j\2\u0528\u00e7\3\2\2\2\u0529\u052a\t\22\2\2\u052a\u00e9\3\2\2"+ - "\2\u052b\u052c\7c\2\2\u052c\u052e\7m\2\2\u052d\u052f\5\u0094K\2\u052e"+ - "\u052d\3\2\2\2\u052e\u052f\3\2\2\2\u052f\u00eb\3\2\2\2\u0530\u0532\7`"+ - "\2\2\u0531\u0533\5\u00d2j\2\u0532\u0531\3\2\2\2\u0532\u0533\3\2\2\2\u0533"+ - "\u00ed\3\2\2\2\u0534\u0536\7I\2\2\u0535\u0537\7c\2\2\u0536\u0535\3\2\2"+ - "\2\u0536\u0537\3\2\2\2\u0537\u00ef\3\2\2\2\u0538\u053a\7]\2\2\u0539\u053b"+ - "\7c\2\2\u053a\u0539\3\2\2\2\u053a\u053b\3\2\2\2\u053b\u00f1\3\2\2\2\u053c"+ - "\u053d\7U\2\2\u053d\u053e\7c\2\2\u053e\u00f3\3\2\2\2\u053f\u0540\7Y\2"+ - "\2\u0540\u00f5\3\2\2\2\u0541\u054a\7Z\2\2\u0542\u054b\5\u0092J\2\u0543"+ - "\u0544\5\u015e\u00b0\2\u0544\u0545\5\u0092J\2\u0545\u054b\3\2\2\2\u0546"+ - "\u0547\5\u00dep\2\u0547\u0548\5\u015e\u00b0\2\u0548\u0549\5\u0092J\2\u0549"+ - "\u054b\3\2\2\2\u054a\u0542\3\2\2\2\u054a\u0543\3\2\2\2\u054a\u0546\3\2"+ - "\2\2\u054b\u054c\3\2\2\2\u054c\u0552\5\u00dan\2\u054d\u0550\7T\2\2\u054e"+ - "\u0551\5\u00f6|\2\u054f\u0551\5\u00dan\2\u0550\u054e\3\2\2\2\u0550\u054f"+ - "\3\2\2\2\u0551\u0553\3\2\2\2\u0552\u054d\3\2\2\2\u0552\u0553\3\2\2\2\u0553"+ - "\u00f7\3\2\2\2\u0554\u0557\5\u00fa~\2\u0555\u0557\5\u0100\u0081\2\u0556"+ - "\u0554\3\2\2\2\u0556\u0555\3\2\2\2\u0557\u00f9\3\2\2\2\u0558\u0563\7W"+ - "\2\2\u0559\u055b\5\u0092J\2\u055a\u0559\3\2\2\2\u055a\u055b\3\2\2\2\u055b"+ - "\u0564\3\2\2\2\u055c\u055e\5\u00dep\2\u055d\u055c\3\2\2\2\u055d\u055e"+ - "\3\2\2\2\u055e\u055f\3\2\2\2\u055f\u0561\5\u015e\u00b0\2\u0560\u0562\5"+ - "\u0092J\2\u0561\u0560\3\2\2\2\u0561\u0562\3\2\2\2\u0562\u0564\3\2\2\2"+ - "\u0563\u055a\3\2\2\2\u0563\u055d\3\2\2\2\u0564\u0565\3\2\2\2\u0565\u0569"+ - "\7f\2\2\u0566\u0568\5\u00fc\177\2\u0567\u0566\3\2\2\2\u0568\u056b\3\2"+ - "\2\2\u0569\u0567\3\2\2\2\u0569\u056a\3\2\2\2\u056a\u056c\3\2\2\2\u056b"+ - "\u0569\3\2\2\2\u056c\u056d\7g\2\2\u056d\u00fb\3\2\2\2\u056e\u056f\5\u00fe"+ - "\u0080\2\u056f\u0571\7m\2\2\u0570\u0572\5\u00dco\2\u0571\u0570\3\2\2\2"+ - "\u0571\u0572\3\2\2\2\u0572\u00fd\3\2\2\2\u0573\u0574\7N\2\2\u0574\u0577"+ - "\5\u00d2j\2\u0575\u0577\7J\2\2\u0576\u0573\3\2\2\2\u0576\u0575\3\2\2\2"+ - "\u0577\u00ff\3\2\2\2\u0578\u0581\7W\2\2\u0579\u0582\5\u0102\u0082\2\u057a"+ - "\u057b\5\u015e\u00b0\2\u057b\u057c\5\u0102\u0082\2\u057c\u0582\3\2\2\2"+ - "\u057d\u057e\5\u00dep\2\u057e\u057f\5\u015e\u00b0\2\u057f\u0580\5\u0102"+ - "\u0082\2\u0580\u0582\3\2\2\2\u0581\u0579\3\2\2\2\u0581\u057a\3\2\2\2\u0581"+ - "\u057d\3\2\2\2\u0582\u0583\3\2\2\2\u0583\u0587\7f\2\2\u0584\u0586\5\u0104"+ - "\u0083\2\u0585\u0584\3\2\2\2\u0586\u0589\3\2\2\2\u0587\u0585\3\2\2\2\u0587"+ - "\u0588\3\2\2\2\u0588\u058a\3\2\2\2\u0589\u0587\3\2\2\2\u058a\u058b\7g"+ - "\2\2\u058b\u0101\3\2\2\2\u058c\u058d\7c\2\2\u058d\u058f\7q\2\2\u058e\u058c"+ - "\3\2\2\2\u058e\u058f\3\2\2\2\u058f\u0590\3\2\2\2\u0590\u0591\5\u00a2R"+ - "\2\u0591\u0592\7n\2\2\u0592\u0593\7d\2\2\u0593\u0594\7\\\2\2\u0594\u0595"+ - "\7e\2\2\u0595\u0103\3\2\2\2\u0596\u0597\5\u0106\u0084\2\u0597\u0599\7"+ - "m\2\2\u0598\u059a\5\u00dco\2\u0599\u0598\3\2\2\2\u0599\u059a\3\2\2\2\u059a"+ - "\u0105\3\2\2\2\u059b\u059c\7N\2\2\u059c\u059f\5\u0108\u0085\2\u059d\u059f"+ - "\7J\2\2\u059e\u059b\3\2\2\2\u059e\u059d\3\2\2\2\u059f\u0107\3\2\2\2\u05a0"+ - "\u05a3\5\u00b0Y\2\u05a1\u05a3\7b\2\2\u05a2\u05a0\3\2\2\2\u05a2\u05a1\3"+ - "\2\2\2\u05a3\u05ab\3\2\2\2\u05a4\u05a7\7k\2\2\u05a5\u05a8\5\u00b0Y\2\u05a6"+ - "\u05a8\7b\2\2\u05a7\u05a5\3\2\2\2\u05a7\u05a6\3\2\2\2\u05a8\u05aa\3\2"+ - "\2\2\u05a9\u05a4\3\2\2\2\u05aa\u05ad\3\2\2\2\u05ab\u05a9\3\2\2\2\u05ab"+ - "\u05ac\3\2\2\2\u05ac\u0109\3\2\2\2\u05ad\u05ab\3\2\2\2\u05ae\u05af\7M"+ - "\2\2\u05af\u05b3\7f\2\2\u05b0\u05b2\5\u010c\u0087\2\u05b1\u05b0\3\2\2"+ - "\2\u05b2\u05b5\3\2\2\2\u05b3\u05b1\3\2\2\2\u05b3\u05b4\3\2\2\2\u05b4\u05b6"+ - "\3\2\2\2\u05b5\u05b3\3\2\2\2\u05b6\u05b7\7g\2\2\u05b7\u010b\3\2\2\2\u05b8"+ - "\u05b9\5\u010e\u0088\2\u05b9\u05bb\7m\2\2\u05ba\u05bc\5\u00dco\2\u05bb"+ - "\u05ba\3\2\2\2\u05bb\u05bc\3\2\2\2\u05bc\u010d\3\2\2\2\u05bd\u05c0\7N"+ - "\2\2\u05be\u05c1\5\u00e2r\2\u05bf\u05c1\5\u0110\u0089\2\u05c0\u05be\3"+ - "\2\2\2\u05c0\u05bf\3\2\2\2\u05c1\u05c4\3\2\2\2\u05c2\u05c4\7J\2\2\u05c3"+ - "\u05bd\3\2\2\2\u05c3\u05c2\3\2\2\2\u05c4\u010f\3\2\2\2\u05c5\u05c6\5\u00d2"+ - "j\2\u05c6\u05c7\7j\2\2\u05c7\u05cc\3\2\2\2\u05c8\u05c9\5\u00d0i\2\u05c9"+ - "\u05ca\7q\2\2\u05ca\u05cc\3\2\2\2\u05cb\u05c5\3\2\2\2\u05cb\u05c8\3\2"+ - "\2\2\u05cb\u05cc\3\2\2\2\u05cc\u05cd\3\2\2\2\u05cd\u05ce\5\u0092J\2\u05ce"+ - "\u0111\3\2\2\2\u05cf\u05d3\7^\2\2\u05d0\u05d4\5\u0092J\2\u05d1\u05d4\5"+ - "\u0114\u008b\2\u05d2\u05d4\5\u0116\u008c\2\u05d3\u05d0\3\2\2\2\u05d3\u05d1"+ - "\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d3\u05d4\3\2\2\2\u05d4\u05d5\3\2\2\2\u05d5"+ - "\u05d6\5\u00dan\2\u05d6\u0113\3\2\2\2\u05d7\u05d9\5\u00dep\2\u05d8\u05d7"+ - "\3\2\2\2\u05d8\u05d9\3\2\2\2\u05d9\u05da\3\2\2\2\u05da\u05dc\5\u015e\u00b0"+ - "\2\u05db\u05dd\5\u0092J\2\u05dc\u05db\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd"+ - "\u05de\3\2\2\2\u05de\u05e0\5\u015e\u00b0\2\u05df\u05e1\5\u00dep\2\u05e0"+ - "\u05df\3\2\2\2\u05e0\u05e1\3\2\2\2\u05e1\u0115\3\2\2\2\u05e2\u05e3\5\u00d2"+ - "j\2\u05e3\u05e4\7j\2\2\u05e4\u05e9\3\2\2\2\u05e5\u05e6\5\u00d0i\2\u05e6"+ - "\u05e7\7q\2\2\u05e7\u05e9\3\2\2\2\u05e8\u05e2\3\2\2\2\u05e8\u05e5\3\2"+ - "\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05eb\7[\2\2\u05eb"+ - "\u05ec\5\u0092J\2\u05ec\u0117\3\2\2\2\u05ed\u05ee\7P\2\2\u05ee\u05ef\5"+ - "\u0092J\2\u05ef\u0119\3\2\2\2\u05f0\u05f3\5\u013e\u00a0\2\u05f1\u05f3"+ - "\7c\2\2\u05f2\u05f0\3\2\2\2\u05f2\u05f1\3\2\2\2\u05f3\u011b\3\2\2\2\u05f4"+ - "\u05f5\7h\2\2\u05f5\u05f6\5\u011e\u0090\2\u05f6\u05f7\7i\2\2\u05f7\u05f8"+ - "\5\u0120\u0091\2\u05f8\u011d\3\2\2\2\u05f9\u05fa\5\u0092J\2\u05fa\u011f"+ - "\3\2\2\2\u05fb\u05fc\5\u00b0Y\2\u05fc\u0121\3\2\2\2\u05fd\u05fe\7\u0085"+ - "\2\2\u05fe\u05ff\5\u00b0Y\2\u05ff\u0123\3\2\2\2\u0600\u0601\7h\2\2\u0601"+ - "\u0602\7i\2\2\u0602\u0603\5\u0120\u0091\2\u0603\u0125\3\2\2\2\u0604\u0605"+ - "\7Q\2\2\u0605\u0606\7h\2\2\u0606\u0607\5\u00b0Y\2\u0607\u0608\7i\2\2\u0608"+ - "\u0609\5\u0120\u0091\2\u0609\u0127\3\2\2\2\u060a\u0610\7S\2\2\u060b\u060c"+ - "\7S\2\2\u060c\u0610\7\u0087\2\2\u060d\u060e\7\u0087\2\2\u060e\u0610\7"+ - "S\2\2\u060f\u060a\3\2\2\2\u060f\u060b\3\2\2\2\u060f\u060d\3\2\2\2\u0610"+ - "\u0611\3\2\2\2\u0611\u0612\5\u0120\u0091\2\u0612\u0129\3\2\2\2\u0613\u0614"+ - "\7K\2\2\u0614\u0615\5\u012c\u0097\2\u0615\u012b\3\2\2\2\u0616\u0617\5"+ - "\u0130\u0099\2\u0617\u0618\5\u012e\u0098\2\u0618\u061b\3\2\2\2\u0619\u061b"+ - "\5\u0130\u0099\2\u061a\u0616\3\2\2\2\u061a\u0619\3\2\2\2\u061b\u012d\3"+ - "\2\2\2\u061c\u061f\5\u0130\u0099\2\u061d\u061f\5\u00b0Y\2\u061e\u061c"+ - "\3\2\2\2\u061e\u061d\3\2\2\2\u061f\u012f\3\2\2\2\u0620\u062c\7d\2\2\u0621"+ - "\u0626\5\u008aF\2\u0622\u0623\7k\2\2\u0623\u0625\5\u008aF\2\u0624\u0622"+ - "\3\2\2\2\u0625\u0628\3\2\2\2\u0626\u0624\3\2\2\2\u0626\u0627\3\2\2\2\u0627"+ - "\u062a\3\2\2\2\u0628\u0626\3\2\2\2\u0629\u062b\7k\2\2\u062a\u0629\3\2"+ - "\2\2\u062a\u062b\3\2\2\2\u062b\u062d\3\2\2\2\u062c\u0621\3\2\2\2\u062c"+ - "\u062d\3\2\2\2\u062d\u062e\3\2\2\2\u062e\u062f\7e\2\2\u062f\u0131\3\2"+ - "\2\2\u0630\u0631\5\u0134\u009b\2\u0631\u0632\7d\2\2\u0632\u0634\5\u0092"+ - "J\2\u0633\u0635\7k\2\2\u0634\u0633\3\2\2\2\u0634\u0635\3\2\2\2\u0635\u0636"+ - "\3\2\2\2\u0636\u0637\7e\2\2\u0637\u0133\3\2\2\2\u0638\u063e\5\u00b2Z\2"+ - "\u0639\u063a\7d\2\2\u063a\u063b\5\u0134\u009b\2\u063b\u063c\7e\2\2\u063c"+ - "\u063e\3\2\2\2\u063d\u0638\3\2\2\2\u063d\u0639\3\2\2\2\u063e\u0135\3\2"+ - "\2\2\u063f\u0646\5\u0138\u009d\2\u0640\u0646\5\u013c\u009f\2\u0641\u0642"+ - "\7d\2\2\u0642\u0643\5\u0092J\2\u0643\u0644\7e\2\2\u0644\u0646\3\2\2\2"+ - "\u0645\u063f\3\2\2\2\u0645\u0640\3\2\2\2\u0645\u0641\3\2\2\2\u0646\u0137"+ - "\3\2\2\2\u0647\u064b\5\u00a0Q\2\u0648\u064b\5\u0140\u00a1\2\u0649\u064b"+ - "\5\u00a4S\2\u064a\u0647\3\2\2\2\u064a\u0648\3\2\2\2\u064a\u0649\3\2\2"+ - "\2\u064b\u0139\3\2\2\2\u064c\u064d\t\23\2\2\u064d\u013b\3\2\2\2\u064e"+ - "\u064f\7c\2\2\u064f\u013d\3\2\2\2\u0650\u0651\7c\2\2\u0651\u0652\7n\2"+ - "\2\u0652\u0653\7c\2\2\u0653\u013f\3\2\2\2\u0654\u0655\5\u00b8]\2\u0655"+ - "\u0656\5\u0142\u00a2\2\u0656\u0141\3\2\2\2\u0657\u065c\7f\2\2\u0658\u065a"+ - "\5\u0144\u00a3\2\u0659\u065b\7k\2\2\u065a\u0659\3\2\2\2\u065a\u065b\3"+ - "\2\2\2\u065b\u065d\3\2\2\2\u065c\u0658\3\2\2\2\u065c\u065d\3\2\2\2\u065d"+ - "\u065e\3\2\2\2\u065e\u065f\7g\2\2\u065f\u0143\3\2\2\2\u0660\u0665\5\u0146"+ - "\u00a4\2\u0661\u0662\7k\2\2\u0662\u0664\5\u0146\u00a4\2\u0663\u0661\3"+ - "\2\2\2\u0664\u0667\3\2\2\2\u0665\u0663\3\2\2\2\u0665\u0666\3\2\2\2\u0666"+ - "\u0145\3\2\2\2\u0667\u0665\3\2\2\2\u0668\u0669\5\u0148\u00a5\2\u0669\u066a"+ - "\7m\2\2\u066a\u066c\3\2\2\2\u066b\u0668\3\2\2\2\u066b\u066c\3\2\2\2\u066c"+ - "\u066d\3\2\2\2\u066d\u066e\5\u014a\u00a6\2\u066e\u0147\3\2\2\2\u066f\u0672"+ - "\5\u0092J\2\u0670\u0672\5\u0142\u00a2\2\u0671\u066f\3\2\2\2\u0671\u0670"+ - "\3\2\2\2\u0672\u0149\3\2\2\2\u0673\u0676\5\u0092J\2\u0674\u0676\5\u0142"+ - "\u00a2\2\u0675\u0673\3\2\2\2\u0675\u0674\3\2\2\2\u0676\u014b\3\2\2\2\u0677"+ - "\u0678\7R\2\2\u0678\u067e\7f\2\2\u0679\u067a\5\u014e\u00a8\2\u067a\u067b"+ - "\5\u015e\u00b0\2\u067b\u067d\3\2\2\2\u067c\u0679\3\2\2\2\u067d\u0680\3"+ - "\2\2\2\u067e\u067c\3\2\2\2\u067e\u067f\3\2\2\2\u067f\u0681\3\2\2\2\u0680"+ - "\u067e\3\2\2\2\u0681\u0682\7g\2\2\u0682\u014d\3\2\2\2\u0683\u0684\5\u00d0"+ - "i\2\u0684\u0685\5\u00b0Y\2\u0685\u0688\3\2\2\2\u0686\u0688\5\u0152\u00aa"+ - "\2\u0687\u0683\3\2\2\2\u0687\u0686\3\2\2\2\u0688\u068a\3\2\2\2\u0689\u068b"+ - "\5\u0150\u00a9\2\u068a\u0689\3\2\2\2\u068a\u068b\3\2\2\2\u068b\u014f\3"+ - "\2\2\2\u068c\u068d\t\24\2\2\u068d\u0151\3\2\2\2\u068e\u0690\7\u0085\2"+ - "\2\u068f\u068e\3\2\2\2\u068f\u0690\3\2\2\2\u0690\u0691\3\2\2\2\u0691\u0692"+ - "\5\u011a\u008e\2\u0692\u0153\3\2\2\2\u0693\u0694\7h\2\2\u0694\u0695\5"+ - "\u0092J\2\u0695\u0696\7i\2\2\u0696\u0155\3\2\2\2\u0697\u0698\7n\2\2\u0698"+ - "\u0699\7d\2\2\u0699\u069a\5\u00b0Y\2\u069a\u069b\7e\2\2\u069b\u0157\3"+ - "\2\2\2\u069c\u06ab\7d\2\2\u069d\u06a4\5\u00d2j\2\u069e\u06a1\5\u0134\u009b"+ - "\2\u069f\u06a0\7k\2\2\u06a0\u06a2\5\u00d2j\2\u06a1\u069f\3\2\2\2\u06a1"+ - "\u06a2\3\2\2\2\u06a2\u06a4\3\2\2\2\u06a3\u069d\3\2\2\2\u06a3\u069e\3\2"+ - "\2\2\u06a4\u06a6\3\2\2\2\u06a5\u06a7\7r\2\2\u06a6\u06a5\3\2\2\2\u06a6"+ - "\u06a7\3\2\2\2\u06a7\u06a9\3\2\2\2\u06a8\u06aa\7k\2\2\u06a9\u06a8\3\2"+ - "\2\2\u06a9\u06aa\3\2\2\2\u06aa\u06ac\3\2\2\2\u06ab\u06a3\3\2\2\2\u06ab"+ - "\u06ac\3\2\2\2\u06ac\u06ad\3\2\2\2\u06ad\u06ae\7e\2\2\u06ae\u0159\3\2"+ - "\2\2\u06af\u06b0\5\u0134\u009b\2\u06b0\u06b1\7n\2\2\u06b1\u06b2\7c\2\2"+ - "\u06b2\u015b\3\2\2\2\u06b3\u06b4\5\u00b0Y\2\u06b4\u015d\3\2\2\2\u06b5"+ - "\u06ba\7l\2\2\u06b6\u06ba\7\2\2\3\u06b7\u06ba\7\u009d\2\2\u06b8\u06ba"+ - "\6\u00b0\24\2\u06b9\u06b5\3\2\2\2\u06b9\u06b6\3\2\2\2\u06b9\u06b7\3\2"+ - "\2\2\u06b9\u06b8\3\2\2\2\u06ba\u015f\3\2\2\2\u00b1\u016e\u0173\u017a\u0184"+ - "\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3\u01cb\u01d5\u01e5\u01f3"+ - "\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260\u026c\u0275\u0283\u0295"+ - "\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2\u02c5\u02cb\u02d0\u02d2"+ - "\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309\u030d\u0310\u031a\u0321"+ - "\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e\u0362\u036a\u036e\u0374"+ - "\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da\u03e5\u03ec\u03f3\u03fd"+ - "\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f\u0445\u044f\u0457\u045d"+ - "\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a\u049d\u04a4\u04af\u04bb"+ - "\u04c5\u04c9\u04cd\u04d1\u04d8\u04e0\u04eb\u04ef\u04f3\u04ff\u0503\u0507"+ - "\u050c\u0513\u051a\u052e\u0532\u0536\u053a\u054a\u0550\u0552\u0556\u055a"+ - "\u055d\u0561\u0563\u0569\u0571\u0576\u0581\u0587\u058e\u0599\u059e\u05a2"+ - "\u05a7\u05ab\u05b3\u05bb\u05c0\u05c3\u05cb\u05d3\u05d8\u05dc\u05e0\u05e8"+ - "\u05f2\u060f\u061a\u061e\u0626\u062a\u062c\u0634\u063d\u0645\u064a\u065a"+ - "\u065c\u0665\u066b\u0671\u0675\u067e\u0687\u068a\u068f\u06a1\u06a3\u06a6"+ - "\u06a9\u06ab\u06b9"; + "\u04b1\3\2\2\2\u04b1\u04b2\7k\2\2\u04b2\u00c5\3\2\2\2\u04b3\u04b4\5\u00d4"+ + "k\2\u04b4\u04b5\7k\2\2\u04b5\u04ba\3\2\2\2\u04b6\u04b7\5\b\5\2\u04b7\u04b8"+ + "\7r\2\2\u04b8\u04ba\3\2\2\2\u04b9\u04b3\3\2\2\2\u04b9\u04b6\3\2\2\2\u04b9"+ + "\u04ba\3\2\2\2\u04ba\u04bb\3\2\2\2\u04bb\u04bc\7\\\2\2\u04bc\u04c1\5\u0092"+ + "J\2\u04bd\u04bf\7I\2\2\u04be\u04c0\7d\2\2\u04bf\u04be\3\2\2\2\u04bf\u04c0"+ + "\3\2\2\2\u04c0\u04c2\3\2\2\2\u04c1\u04bd\3\2\2\2\u04c1\u04c2\3\2\2\2\u04c2"+ + "\u00c7\3\2\2\2\u04c3\u04c4\7W\2\2\u04c4\u04c5\7d\2\2\u04c5\u00c9\3\2\2"+ + "\2\u04c6\u04c7\5\u0150\u00a9\2\u04c7\u00cb\3\2\2\2\u04c8\u04cc\5\u00ce"+ + "h\2\u04c9\u04cc\5\u00d6l\2\u04ca\u04cc\5\u00dan\2\u04cb\u04c8\3\2\2\2"+ + "\u04cb\u04c9\3\2\2\2\u04cb\u04ca\3\2\2\2\u04cc\u00cd\3\2\2\2\u04cd\u04d9"+ + "\7Y\2\2\u04ce\u04da\5\u00d0i\2\u04cf\u04d5\7e\2\2\u04d0\u04d1\5\u00d0"+ + "i\2\u04d1\u04d2\5\u015e\u00b0\2\u04d2\u04d4\3\2\2\2\u04d3\u04d0\3\2\2"+ + "\2\u04d4\u04d7\3\2\2\2\u04d5\u04d3\3\2\2\2\u04d5\u04d6\3\2\2\2\u04d6\u04d8"+ + "\3\2\2\2\u04d7\u04d5\3\2\2\2\u04d8\u04da\7f\2\2\u04d9\u04ce\3\2\2\2\u04d9"+ + "\u04cf\3\2\2\2\u04da\u00cf\3\2\2\2\u04db\u04e1\5\u00d2j\2\u04dc\u04de"+ + "\5\u00b0Y\2\u04dd\u04dc\3\2\2\2\u04dd\u04de\3\2\2\2\u04de\u04df\3\2\2"+ + "\2\u04df\u04e0\7k\2\2\u04e0\u04e2\5\u00d4k\2\u04e1\u04dd\3\2\2\2\u04e1"+ + "\u04e2\3\2\2\2\u04e2\u00d1\3\2\2\2\u04e3\u04e8\7d\2\2\u04e4\u04e5\7l\2"+ + "\2\u04e5\u04e7\7d\2\2\u04e6\u04e4\3\2\2\2\u04e7\u04ea\3\2\2\2\u04e8\u04e6"+ + "\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u00d3\3\2\2\2\u04ea\u04e8\3\2\2\2\u04eb"+ + "\u04f0\5\u0092J\2\u04ec\u04ed\7l\2\2\u04ed\u04ef\5\u0092J\2\u04ee\u04ec"+ + "\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2\2\2\u04f0\u04f1\3\2\2\2\u04f1"+ + "\u00d5\3\2\2\2\u04f2\u04f0\3\2\2\2\u04f3\u04ff\7]\2\2\u04f4\u0500\5\u00d8"+ + "m\2\u04f5\u04fb\7e\2\2\u04f6\u04f7\5\u00d8m\2\u04f7\u04f8\5\u015e\u00b0"+ + "\2\u04f8\u04fa\3\2\2\2\u04f9\u04f6\3\2\2\2\u04fa\u04fd\3\2\2\2\u04fb\u04f9"+ + "\3\2\2\2\u04fb\u04fc\3\2\2\2\u04fc\u04fe\3\2\2\2\u04fd\u04fb\3\2\2\2\u04fe"+ + "\u0500\7f\2\2\u04ff\u04f4\3\2\2\2\u04ff\u04f5\3\2\2\2\u0500\u00d7\3\2"+ + "\2\2\u0501\u0503\7d\2\2\u0502\u0504\7k\2\2\u0503\u0502\3\2\2\2\u0503\u0504"+ + "\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u0506\5\u00b0Y\2\u0506\u00d9\3\2\2"+ + "\2\u0507\u0513\7b\2\2\u0508\u0514\5\u0084C\2\u0509\u050f\7e\2\2\u050a"+ + "\u050b\5\u0084C\2\u050b\u050c\5\u015e\u00b0\2\u050c\u050e\3\2\2\2\u050d"+ + "\u050a\3\2\2\2\u050e\u0511\3\2\2\2\u050f\u050d\3\2\2\2\u050f\u0510\3\2"+ + "\2\2\u0510\u0512\3\2\2\2\u0511\u050f\3\2\2\2\u0512\u0514\7f\2\2\u0513"+ + "\u0508\3\2\2\2\u0513\u0509\3\2\2\2\u0514\u00db\3\2\2\2\u0515\u0517\7g"+ + "\2\2\u0516\u0518\5\u00dep\2\u0517\u0516\3\2\2\2\u0517\u0518\3\2\2\2\u0518"+ + "\u0519\3\2\2\2\u0519\u051a\7h\2\2\u051a\u00dd\3\2\2\2\u051b\u051d\5\u015e"+ + "\u00b0\2\u051c\u051b\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051e\3\2\2\2\u051e"+ + "\u051f\5\u0094K\2\u051f\u0520\5\u015e\u00b0\2\u0520\u0522\3\2\2\2\u0521"+ + "\u051c\3\2\2\2\u0522\u0523\3\2\2\2\u0523\u0521\3\2\2\2\u0523\u0524\3\2"+ + "\2\2\u0524\u00df\3\2\2\2\u0525\u052b\5\u00e4s\2\u0526\u052b\5\u00e6t\2"+ + "\u0527\u052b\5\u00e8u\2\u0528\u052b\5\u00e2r\2\u0529\u052b\5\u0086D\2"+ + "\u052a\u0525\3\2\2\2\u052a\u0526\3\2\2\2\u052a\u0527\3\2\2\2\u052a\u0528"+ + "\3\2\2\2\u052a\u0529\3\2\2\2\u052b\u00e1\3\2\2\2\u052c\u052d\5\u0092J"+ + "\2\u052d\u00e3\3\2\2\2\u052e\u052f\5\u0092J\2\u052f\u0530\7\u0088\2\2"+ + "\u0530\u0531\5\u0092J\2\u0531\u00e5\3\2\2\2\u0532\u0533\5\u0092J\2\u0533"+ + "\u0534\t\21\2\2\u0534\u00e7\3\2\2\2\u0535\u0536\5\u00d4k\2\u0536\u0537"+ + "\5\u00c4c\2\u0537\u0538\5\u00d4k\2\u0538\u00e9\3\2\2\2\u0539\u053a\t\22"+ + "\2\2\u053a\u00eb\3\2\2\2\u053b\u053c\7d\2\2\u053c\u053e\7n\2\2\u053d\u053f"+ + "\5\u0094K\2\u053e\u053d\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u00ed\3\2\2"+ + "\2\u0540\u0542\7a\2\2\u0541\u0543\5\u00d4k\2\u0542\u0541\3\2\2\2\u0542"+ + "\u0543\3\2\2\2\u0543\u00ef\3\2\2\2\u0544\u0546\7J\2\2\u0545\u0547\7d\2"+ + "\2\u0546\u0545\3\2\2\2\u0546\u0547\3\2\2\2\u0547\u00f1\3\2\2\2\u0548\u054a"+ + "\7^\2\2\u0549\u054b\7d\2\2\u054a\u0549\3\2\2\2\u054a\u054b\3\2\2\2\u054b"+ + "\u00f3\3\2\2\2\u054c\u054d\7V\2\2\u054d\u054e\7d\2\2\u054e\u00f5\3\2\2"+ + "\2\u054f\u0550\7Z\2\2\u0550\u00f7\3\2\2\2\u0551\u055a\7[\2\2\u0552\u055b"+ + "\5\u0092J\2\u0553\u0554\5\u015e\u00b0\2\u0554\u0555\5\u0092J\2\u0555\u055b"+ + "\3\2\2\2\u0556\u0557\5\u00e0q\2\u0557\u0558\5\u015e\u00b0\2\u0558\u0559"+ + "\5\u0092J\2\u0559\u055b\3\2\2\2\u055a\u0552\3\2\2\2\u055a\u0553\3\2\2"+ + "\2\u055a\u0556\3\2\2\2\u055b\u055c\3\2\2\2\u055c\u0562\5\u00dco\2\u055d"+ + "\u0560\7U\2\2\u055e\u0561\5\u00f8}\2\u055f\u0561\5\u00dco\2\u0560\u055e"+ + "\3\2\2\2\u0560\u055f\3\2\2\2\u0561\u0563\3\2\2\2\u0562\u055d\3\2\2\2\u0562"+ + "\u0563\3\2\2\2\u0563\u00f9\3\2\2\2\u0564\u0567\5\u00fc\177\2\u0565\u0567"+ + "\5\u0102\u0082\2\u0566\u0564\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u00fb\3"+ + "\2\2\2\u0568\u0573\7X\2\2\u0569\u056b\5\u0092J\2\u056a\u0569\3\2\2\2\u056a"+ + "\u056b\3\2\2\2\u056b\u0574\3\2\2\2\u056c\u056e\5\u00e0q\2\u056d\u056c"+ + "\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0571\5\u015e\u00b0"+ + "\2\u0570\u0572\5\u0092J\2\u0571\u0570\3\2\2\2\u0571\u0572\3\2\2\2\u0572"+ + "\u0574\3\2\2\2\u0573\u056a\3\2\2\2\u0573\u056d\3\2\2\2\u0574\u0575\3\2"+ + "\2\2\u0575\u0579\7g\2\2\u0576\u0578\5\u00fe\u0080\2\u0577\u0576\3\2\2"+ + "\2\u0578\u057b\3\2\2\2\u0579\u0577\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u057c"+ + "\3\2\2\2\u057b\u0579\3\2\2\2\u057c\u057d\7h\2\2\u057d\u00fd\3\2\2\2\u057e"+ + "\u057f\5\u0100\u0081\2\u057f\u0581\7n\2\2\u0580\u0582\5\u00dep\2\u0581"+ + "\u0580\3\2\2\2\u0581\u0582\3\2\2\2\u0582\u00ff\3\2\2\2\u0583\u0584\7O"+ + "\2\2\u0584\u0587\5\u00d4k\2\u0585\u0587\7K\2\2\u0586\u0583\3\2\2\2\u0586"+ + "\u0585\3\2\2\2\u0587\u0101\3\2\2\2\u0588\u0591\7X\2\2\u0589\u0592\5\u0104"+ + "\u0083\2\u058a\u058b\5\u015e\u00b0\2\u058b\u058c\5\u0104\u0083\2\u058c"+ + "\u0592\3\2\2\2\u058d\u058e\5\u00e0q\2\u058e\u058f\5\u015e\u00b0\2\u058f"+ + "\u0590\5\u0104\u0083\2\u0590\u0592\3\2\2\2\u0591\u0589\3\2\2\2\u0591\u058a"+ + "\3\2\2\2\u0591\u058d\3\2\2\2\u0592\u0593\3\2\2\2\u0593\u0597\7g\2\2\u0594"+ + "\u0596\5\u0106\u0084\2\u0595\u0594\3\2\2\2\u0596\u0599\3\2\2\2\u0597\u0595"+ + "\3\2\2\2\u0597\u0598\3\2\2\2\u0598\u059a\3\2\2\2\u0599\u0597\3\2\2\2\u059a"+ + "\u059b\7h\2\2\u059b\u0103\3\2\2\2\u059c\u059d\7d\2\2\u059d\u059f\7r\2"+ + "\2\u059e\u059c\3\2\2\2\u059e\u059f\3\2\2\2\u059f\u05a0\3\2\2\2\u05a0\u05a1"+ + "\5\u00a2R\2\u05a1\u05a2\7o\2\2\u05a2\u05a3\7e\2\2\u05a3\u05a4\7]\2\2\u05a4"+ + "\u05a5\7f\2\2\u05a5\u0105\3\2\2\2\u05a6\u05a7\5\u0108\u0085\2\u05a7\u05a9"+ + "\7n\2\2\u05a8\u05aa\5\u00dep\2\u05a9\u05a8\3\2\2\2\u05a9\u05aa\3\2\2\2"+ + "\u05aa\u0107\3\2\2\2\u05ab\u05ac\7O\2\2\u05ac\u05af\5\u010a\u0086\2\u05ad"+ + "\u05af\7K\2\2\u05ae\u05ab\3\2\2\2\u05ae\u05ad\3\2\2\2\u05af\u0109\3\2"+ + "\2\2\u05b0\u05b3\5\u00b0Y\2\u05b1\u05b3\7c\2\2\u05b2\u05b0\3\2\2\2\u05b2"+ + "\u05b1\3\2\2\2\u05b3\u05bb\3\2\2\2\u05b4\u05b7\7l\2\2\u05b5\u05b8\5\u00b0"+ + "Y\2\u05b6\u05b8\7c\2\2\u05b7\u05b5\3\2\2\2\u05b7\u05b6\3\2\2\2\u05b8\u05ba"+ + "\3\2\2\2\u05b9\u05b4\3\2\2\2\u05ba\u05bd\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bb"+ + "\u05bc\3\2\2\2\u05bc\u010b\3\2\2\2\u05bd\u05bb\3\2\2\2\u05be\u05bf\7N"+ + "\2\2\u05bf\u05c3\7g\2\2\u05c0\u05c2\5\u010e\u0088\2\u05c1\u05c0\3\2\2"+ + "\2\u05c2\u05c5\3\2\2\2\u05c3\u05c1\3\2\2\2\u05c3\u05c4\3\2\2\2\u05c4\u05c6"+ + "\3\2\2\2\u05c5\u05c3\3\2\2\2\u05c6\u05c7\7h\2\2\u05c7\u010d\3\2\2\2\u05c8"+ + "\u05c9\5\u0110\u0089\2\u05c9\u05cb\7n\2\2\u05ca\u05cc\5\u00dep\2\u05cb"+ + "\u05ca\3\2\2\2\u05cb\u05cc\3\2\2\2\u05cc\u010f\3\2\2\2\u05cd\u05d0\7O"+ + "\2\2\u05ce\u05d1\5\u00e4s\2\u05cf\u05d1\5\u0112\u008a\2\u05d0\u05ce\3"+ + "\2\2\2\u05d0\u05cf\3\2\2\2\u05d1\u05d4\3\2\2\2\u05d2\u05d4\7K\2\2\u05d3"+ + "\u05cd\3\2\2\2\u05d3\u05d2\3\2\2\2\u05d4\u0111\3\2\2\2\u05d5\u05d6\5\u00d4"+ + "k\2\u05d6\u05d7\7k\2\2\u05d7\u05dc\3\2\2\2\u05d8\u05d9\5\u00d2j\2\u05d9"+ + "\u05da\7r\2\2\u05da\u05dc\3\2\2\2\u05db\u05d5\3\2\2\2\u05db\u05d8\3\2"+ + "\2\2\u05db\u05dc\3\2\2\2\u05dc\u05dd\3\2\2\2\u05dd\u05de\5\u0092J\2\u05de"+ + "\u0113\3\2\2\2\u05df\u05e3\7_\2\2\u05e0\u05e4\5\u0092J\2\u05e1\u05e4\5"+ + "\u0116\u008c\2\u05e2\u05e4\5\u00c6d\2\u05e3\u05e0\3\2\2\2\u05e3\u05e1"+ + "\3\2\2\2\u05e3\u05e2\3\2\2\2\u05e3\u05e4\3\2\2\2\u05e4\u05e5\3\2\2\2\u05e5"+ + "\u05e6\5\u00dco\2\u05e6\u0115\3\2\2\2\u05e7\u05e9\5\u00e0q\2\u05e8\u05e7"+ + "\3\2\2\2\u05e8\u05e9\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea\u05ec\5\u015e\u00b0"+ + "\2\u05eb\u05ed\5\u0092J\2\u05ec\u05eb\3\2\2\2\u05ec\u05ed\3\2\2\2\u05ed"+ + "\u05ee\3\2\2\2\u05ee\u05f0\5\u015e\u00b0\2\u05ef\u05f1\5\u00e0q\2\u05f0"+ + "\u05ef\3\2\2\2\u05f0\u05f1\3\2\2\2\u05f1\u0117\3\2\2\2\u05f2\u05f3\7Q"+ + "\2\2\u05f3\u05f4\5\u0092J\2\u05f4\u0119\3\2\2\2\u05f5\u05f8\5\u013e\u00a0"+ + "\2\u05f6\u05f8\7d\2\2\u05f7\u05f5\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8\u011b"+ + "\3\2\2\2\u05f9\u05fa\7i\2\2\u05fa\u05fb\5\u011e\u0090\2\u05fb\u05fc\7"+ + "j\2\2\u05fc\u05fd\5\u0120\u0091\2\u05fd\u011d\3\2\2\2\u05fe\u05ff\5\u0092"+ + "J\2\u05ff\u011f\3\2\2\2\u0600\u0601\5\u00b0Y\2\u0601\u0121\3\2\2\2\u0602"+ + "\u0603\7\u0086\2\2\u0603\u0604\5\u00b0Y\2\u0604\u0123\3\2\2\2\u0605\u0606"+ + "\7i\2\2\u0606\u0607\7j\2\2\u0607\u0608\5\u0120\u0091\2\u0608\u0125\3\2"+ + "\2\2\u0609\u060a\7R\2\2\u060a\u060b\7i\2\2\u060b\u060c\5\u00b0Y\2\u060c"+ + "\u060d\7j\2\2\u060d\u060e\5\u0120\u0091\2\u060e\u0127\3\2\2\2\u060f\u0615"+ + "\7T\2\2\u0610\u0611\7T\2\2\u0611\u0615\7\u0088\2\2\u0612\u0613\7\u0088"+ + "\2\2\u0613\u0615\7T\2\2\u0614\u060f\3\2\2\2\u0614\u0610\3\2\2\2\u0614"+ + "\u0612\3\2\2\2\u0615\u0616\3\2\2\2\u0616\u0617\5\u0120\u0091\2\u0617\u0129"+ + "\3\2\2\2\u0618\u0619\7L\2\2\u0619\u061a\5\u012c\u0097\2\u061a\u012b\3"+ + "\2\2\2\u061b\u061c\5\u0130\u0099\2\u061c\u061d\5\u012e\u0098\2\u061d\u0620"+ + "\3\2\2\2\u061e\u0620\5\u0130\u0099\2\u061f\u061b\3\2\2\2\u061f\u061e\3"+ + "\2\2\2\u0620\u012d\3\2\2\2\u0621\u0624\5\u0130\u0099\2\u0622\u0624\5\u00b0"+ + "Y\2\u0623\u0621\3\2\2\2\u0623\u0622\3\2\2\2\u0624\u012f\3\2\2\2\u0625"+ + "\u0631\7e\2\2\u0626\u062b\5\u008aF\2\u0627\u0628\7l\2\2\u0628\u062a\5"+ + "\u008aF\2\u0629\u0627\3\2\2\2\u062a\u062d\3\2\2\2\u062b\u0629\3\2\2\2"+ + "\u062b\u062c\3\2\2\2\u062c\u062f\3\2\2\2\u062d\u062b\3\2\2\2\u062e\u0630"+ + "\7l\2\2\u062f\u062e\3\2\2\2\u062f\u0630\3\2\2\2\u0630\u0632\3\2\2\2\u0631"+ + "\u0626\3\2\2\2\u0631\u0632\3\2\2\2\u0632\u0633\3\2\2\2\u0633\u0634\7f"+ + "\2\2\u0634\u0131\3\2\2\2\u0635\u0636\5\u0134\u009b\2\u0636\u0637\7e\2"+ + "\2\u0637\u0639\5\u0092J\2\u0638\u063a\7l\2\2\u0639\u0638\3\2\2\2\u0639"+ + "\u063a\3\2\2\2\u063a\u063b\3\2\2\2\u063b\u063c\7f\2\2\u063c\u0133\3\2"+ + "\2\2\u063d\u0643\5\u00b2Z\2\u063e\u063f\7e\2\2\u063f\u0640\5\u0134\u009b"+ + "\2\u0640\u0641\7f\2\2\u0641\u0643\3\2\2\2\u0642\u063d\3\2\2\2\u0642\u063e"+ + "\3\2\2\2\u0643\u0135\3\2\2\2\u0644\u064b\5\u0138\u009d\2\u0645\u064b\5"+ + "\u013c\u009f\2\u0646\u0647\7e\2\2\u0647\u0648\5\u0092J\2\u0648\u0649\7"+ + "f\2\2\u0649\u064b\3\2\2\2\u064a\u0644\3\2\2\2\u064a\u0645\3\2\2\2\u064a"+ + "\u0646\3\2\2\2\u064b\u0137\3\2\2\2\u064c\u0650\5\u00a0Q\2\u064d\u0650"+ + "\5\u0140\u00a1\2\u064e\u0650\5\u00a4S\2\u064f\u064c\3\2\2\2\u064f\u064d"+ + "\3\2\2\2\u064f\u064e\3\2\2\2\u0650\u0139\3\2\2\2\u0651\u0652\t\23\2\2"+ + "\u0652\u013b\3\2\2\2\u0653\u0654\7d\2\2\u0654\u013d\3\2\2\2\u0655\u0656"+ + "\7d\2\2\u0656\u0657\7o\2\2\u0657\u0658\7d\2\2\u0658\u013f\3\2\2\2\u0659"+ + "\u065a\5\u00b8]\2\u065a\u065b\5\u0142\u00a2\2\u065b\u0141\3\2\2\2\u065c"+ + "\u0661\7g\2\2\u065d\u065f\5\u0144\u00a3\2\u065e\u0660\7l\2\2\u065f\u065e"+ + "\3\2\2\2\u065f\u0660\3\2\2\2\u0660\u0662\3\2\2\2\u0661\u065d\3\2\2\2\u0661"+ + "\u0662\3\2\2\2\u0662\u0663\3\2\2\2\u0663\u0664\7h\2\2\u0664\u0143\3\2"+ + "\2\2\u0665\u066a\5\u0146\u00a4\2\u0666\u0667\7l\2\2\u0667\u0669\5\u0146"+ + "\u00a4\2\u0668\u0666\3\2\2\2\u0669\u066c\3\2\2\2\u066a\u0668\3\2\2\2\u066a"+ + "\u066b\3\2\2\2\u066b\u0145\3\2\2\2\u066c\u066a\3\2\2\2\u066d\u066e\5\u0148"+ + "\u00a5\2\u066e\u066f\7n\2\2\u066f\u0671\3\2\2\2\u0670\u066d\3\2\2\2\u0670"+ + "\u0671\3\2\2\2\u0671\u0672\3\2\2\2\u0672\u0673\5\u014a\u00a6\2\u0673\u0147"+ + "\3\2\2\2\u0674\u0677\5\u0092J\2\u0675\u0677\5\u0142\u00a2\2\u0676\u0674"+ + "\3\2\2\2\u0676\u0675\3\2\2\2\u0677\u0149\3\2\2\2\u0678\u067b\5\u0092J"+ + "\2\u0679\u067b\5\u0142\u00a2\2\u067a\u0678\3\2\2\2\u067a\u0679\3\2\2\2"+ + "\u067b\u014b\3\2\2\2\u067c\u067d\7S\2\2\u067d\u0683\7g\2\2\u067e\u067f"+ + "\5\u014e\u00a8\2\u067f\u0680\5\u015e\u00b0\2\u0680\u0682\3\2\2\2\u0681"+ + "\u067e\3\2\2\2\u0682\u0685\3\2\2\2\u0683\u0681\3\2\2\2\u0683\u0684\3\2"+ + "\2\2\u0684\u0686\3\2\2\2\u0685\u0683\3\2\2\2\u0686\u0687\7h\2\2\u0687"+ + "\u014d\3\2\2\2\u0688\u0689\5\u00d2j\2\u0689\u068a\5\u00b0Y\2\u068a\u068d"+ + "\3\2\2\2\u068b\u068d\5\u0152\u00aa\2\u068c\u0688\3\2\2\2\u068c\u068b\3"+ + "\2\2\2\u068d\u068f\3\2\2\2\u068e\u0690\5\u0150\u00a9\2\u068f\u068e\3\2"+ + "\2\2\u068f\u0690\3\2\2\2\u0690\u014f\3\2\2\2\u0691\u0692\t\24\2\2\u0692"+ + "\u0151\3\2\2\2\u0693\u0695\7\u0086\2\2\u0694\u0693\3\2\2\2\u0694\u0695"+ + "\3\2\2\2\u0695\u0696\3\2\2\2\u0696\u0697\5\u011a\u008e\2\u0697\u0153\3"+ + "\2\2\2\u0698\u0699\7i\2\2\u0699\u069a\5\u0092J\2\u069a\u069b\7j\2\2\u069b"+ + "\u0155\3\2\2\2\u069c\u069d\7o\2\2\u069d\u069e\7e\2\2\u069e\u069f\5\u00b0"+ + "Y\2\u069f\u06a0\7f\2\2\u06a0\u0157\3\2\2\2\u06a1\u06b0\7e\2\2\u06a2\u06a9"+ + "\5\u00d4k\2\u06a3\u06a6\5\u0134\u009b\2\u06a4\u06a5\7l\2\2\u06a5\u06a7"+ + "\5\u00d4k\2\u06a6\u06a4\3\2\2\2\u06a6\u06a7\3\2\2\2\u06a7\u06a9\3\2\2"+ + "\2\u06a8\u06a2\3\2\2\2\u06a8\u06a3\3\2\2\2\u06a9\u06ab\3\2\2\2\u06aa\u06ac"+ + "\7s\2\2\u06ab\u06aa\3\2\2\2\u06ab\u06ac\3\2\2\2\u06ac\u06ae\3\2\2\2\u06ad"+ + "\u06af\7l\2\2\u06ae\u06ad\3\2\2\2\u06ae\u06af\3\2\2\2\u06af\u06b1\3\2"+ + "\2\2\u06b0\u06a8\3\2\2\2\u06b0\u06b1\3\2\2\2\u06b1\u06b2\3\2\2\2\u06b2"+ + "\u06b3\7f\2\2\u06b3\u0159\3\2\2\2\u06b4\u06b5\5\u0134\u009b\2\u06b5\u06b6"+ + "\7o\2\2\u06b6\u06b7\7d\2\2\u06b7\u015b\3\2\2\2\u06b8\u06b9\5\u00b0Y\2"+ + "\u06b9\u015d\3\2\2\2\u06ba\u06bf\7m\2\2\u06bb\u06bf\7\2\2\3\u06bc\u06bf"+ + "\7\u009e\2\2\u06bd\u06bf\6\u00b0\24\2\u06be\u06ba\3\2\2\2\u06be\u06bb"+ + "\3\2\2\2\u06be\u06bc\3\2\2\2\u06be\u06bd\3\2\2\2\u06bf\u015f\3\2\2\2\u00b3"+ + "\u016e\u0173\u017a\u0184\u018a\u0190\u01a0\u01a4\u01ad\u01b9\u01bd\u01c3"+ + "\u01cb\u01d5\u01e5\u01f3\u01f7\u01fe\u0206\u020f\u022f\u0237\u024f\u0260"+ + "\u026c\u0275\u0283\u0295\u029c\u02a1\u02a6\u02b0\u02b3\u02b7\u02bb\u02c2"+ + "\u02c5\u02cb\u02d0\u02d2\u02d5\u02dc\u02e1\u02f4\u02fc\u0300\u0303\u0309"+ + "\u030d\u0310\u031a\u0321\u0328\u0334\u033a\u0341\u0346\u034c\u0358\u035e"+ + "\u0362\u036a\u036e\u0374\u0377\u037d\u0382\u0396\u03b9\u03bb\u03d2\u03da"+ + "\u03e5\u03ec\u03f3\u03fd\u040b\u0421\u0423\u042b\u042f\u0433\u0436\u043f"+ + "\u0445\u044f\u0457\u045d\u0466\u0471\u047c\u0480\u0482\u048d\u0496\u049a"+ + "\u049d\u04a4\u04af\u04b9\u04bf\u04c1\u04cb\u04d5\u04d9\u04dd\u04e1\u04e8"+ + "\u04f0\u04fb\u04ff\u0503\u050f\u0513\u0517\u051c\u0523\u052a\u053e\u0542"+ + "\u0546\u054a\u055a\u0560\u0562\u0566\u056a\u056d\u0571\u0573\u0579\u0581"+ + "\u0586\u0591\u0597\u059e\u05a9\u05ae\u05b2\u05b7\u05bb\u05c3\u05cb\u05d0"+ + "\u05d3\u05db\u05e3\u05e8\u05ec\u05f0\u05f7\u0614\u061f\u0623\u062b\u062f"+ + "\u0631\u0639\u0642\u064a\u064f\u065f\u0661\u066a\u0670\u0676\u067a\u0683"+ + "\u068c\u068f\u0694\u06a6\u06a8\u06ab\u06ae\u06b0\u06be"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { @@ -12885,4 +12910,4 @@ private boolean eos_sempred(EosContext _localctx, int predIndex) { _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); } } -} \ No newline at end of file +} diff --git a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java index 212418151..17069a23c 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -900,6 +900,13 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitAssign_op(GobraParser.Assign_opContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1180,13 +1187,6 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitForClause(GobraParser.ForClauseContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitRangeClause(GobraParser.RangeClauseContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -1439,4 +1439,4 @@ public class GobraParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitEos(GobraParser.EosContext ctx) { return visitChildren(ctx); } -} \ No newline at end of file +} diff --git a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java index 7d77b604a..20b91c3b6 100644 --- a/src/main/java/viper/gobra/frontend/GobraParserVisitor.java +++ b/src/main/java/viper/gobra/frontend/GobraParserVisitor.java @@ -1,4 +1,4 @@ -// Generated from /Users/joao/Code/gobraHome/gobra/src/main/antlr4/GobraParser.g4 by ANTLR 4.9.2 +// Generated from /main/antlr4/GobraParser.g4 by ANTLR 4.9.1 package viper.gobra.frontend; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -804,6 +804,12 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitAssign_op(GobraParser.Assign_opContext ctx); + /** + * Visit a parse tree produced by {@link GobraParser#rangeClause}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRangeClause(GobraParser.RangeClauseContext ctx); /** * Visit a parse tree produced by {@link GobraParser#packageClause}. * @param ctx the parse tree @@ -1044,12 +1050,6 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitForClause(GobraParser.ForClauseContext ctx); - /** - * Visit a parse tree produced by {@link GobraParser#rangeClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitRangeClause(GobraParser.RangeClauseContext ctx); /** * Visit a parse tree produced by {@link GobraParser#goStmt}. * @param ctx the parse tree @@ -1266,4 +1266,4 @@ public interface GobraParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitEos(GobraParser.EosContext ctx); -} \ No newline at end of file +} diff --git a/src/main/scala/viper/gobra/ast/frontend/Ast.scala b/src/main/scala/viper/gobra/ast/frontend/Ast.scala index ff4571cf5..bfa306d11 100644 --- a/src/main/scala/viper/gobra/ast/frontend/Ast.scala +++ b/src/main/scala/viper/gobra/ast/frontend/Ast.scala @@ -269,7 +269,7 @@ case class PForStmt(pre: Option[PSimpleStmt], cond: PExpression, post: Option[PS case class PAssForRange(range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement -case class PShortForRange(range: PRange, shorts: Vector[PIdnUnk], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement +case class PShortForRange(range: PRange, shorts: Vector[PUnkLikeId], addressable: Vector[Boolean], spec: PLoopSpec, body: PBlock) extends PGeneralForStmt with PScope with PGhostifiableStatement case class PGoStmt(exp: PExpression) extends PActualStatement @@ -797,7 +797,7 @@ sealed trait PMisc extends PNode sealed trait PActualMisc extends PMisc -case class PRange(exp: PExpression) extends PActualMisc +case class PRange(exp: PExpression, enumerated: PUnkLikeId) extends PActualMisc sealed trait PParameter extends PMisc { def typ: PType diff --git a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala index d6e5074be..a87260f33 100644 --- a/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala +++ b/src/main/scala/viper/gobra/ast/frontend/PrettyPrinter.scala @@ -245,8 +245,8 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter }) case PAssForRange(range, ass, spec, body) => showSpec(spec) <> "for" <+> showExprList(ass) <+> "=" <+> showRange(range) <+> block(showStmt(body)) - case PShortForRange(range, shorts, spec, body) => - showSpec(spec) <> "for" <+> showIdList(shorts) <+> ":=" <+> showRange(range) <+> block(showStmt(body)) + case PShortForRange(range, shorts, addressable, spec, body) => + showSpec(spec) <> "for" <+> showList(shorts zip addressable){ case (l, a) => showAddressable(a, l) } <+> ":=" <+> showRange(range) <+> block(showStmt(body)) case PGoStmt(exp) => "go" <+> showExpr(exp) case PSelectStmt(send, rec, aRec, sRec, dflt) => "select" <+> block( @@ -324,7 +324,10 @@ class DefaultPrettyPrinter extends PrettyPrinter with kiama.output.PrettyPrinter "case" <+> showIdList(shorts) <+> "=" <+> showExpr(recv) <> ":" <> showNestedStmtList(body.stmts) } - def showRange(n: PRange): Doc = "range" <+> showExpr(n.exp) + def showRange(n: PRange): Doc = n.enumerated match { + case _: PWildcard => "range" <+> showExpr(n.exp) + case _ => "range" <+> showExpr(n.exp) <+> "with" <+> showId(n.enumerated) + } // expressions diff --git a/src/main/scala/viper/gobra/frontend/Desugar.scala b/src/main/scala/viper/gobra/frontend/Desugar.scala index a2ba1633d..ad56eae21 100644 --- a/src/main/scala/viper/gobra/frontend/Desugar.scala +++ b/src/main/scala/viper/gobra/frontend/Desugar.scala @@ -172,6 +172,8 @@ object Desugar { private val nm = new NameManager + private val MapExhalePermDenom = 1000000 + type Identity = (Meta, TypeInfo) private def abstraction(id: PIdnNode, info: TypeInfo): Identity = { @@ -970,6 +972,514 @@ object Desugar { } } + def leftOfAssignmentNoInit(idn: PIdnNode, info: TypeInfo)(t: in.Type): in.LocalVar = { + idn match { + case _: PWildcard => in.LocalVar(nm.fresh(idn, info), t)(meta(idn, info)) + + case _ => + assignableVarD(ctx, info)(idn) match { + case Left(v) => v.asInstanceOf[in.LocalVar] + case Right(v) => violation(s"Expected an assignable variable, but got $v instead") + } + } + } + + /** + * This case handles for loops with a range clause of the form: + * + * + * // i0 here is an int variable starting from 0 and used at the + * // encoded loop condition + * for i, j := range x with i0 { + * body + * } + * + * In the case where x is a slice or array the following code is produced. Note + * that everything is in a new block so it can shadow variables with the same + * name declared outside. This is also the go behaviour. + * + * c := x // save the value of the slice/array since changing it doesn't change the iteration + * length := len(x) + * + * if (length == 0) { + * havoc i + * assume i0 == i + * havoc j // [v] + * assert + * } else { + * var i int = 0 + * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 + * var j T = c[0] // [v] + * invariant 0 <= i0 && i0 <= len(c) + * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part + * + * for i0 < length { + * + * i0 += 1 + * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ } + * } + * } + * + * In the case where the value variable 'j' is missing all the code annotated with [v] + * is omitted + */ + def desugarArrSliceShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + (elemType, typ) = underlyingType(exp.typ) match { + case s: in.SliceT => (s.elems, s) + case a: in.ArrayT => (a.elems, a) + case _ => violation("Expected slice or array in for-range statement") + } + + rangeExpSrc = meta(range.exp, info) + iSrc = meta(shorts(0), info) + + hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard]) + + jSrc = if (hasValue) meta(shorts(1), info) else src + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + + i = leftOfAssignmentNoInit(shorts(0), info)(in.IntT(Addressability.exclusiveVariable)) + _ <- declare(i) + j = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(elemType) else i + + _ <- if (hasValue) declare(j) else unit(in.Seqn(Vector())(src)) + i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable)) + _ <- declare(i0) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + addedInvariantsBefore = Vector( + in.ExprAssertion(in.And( + in.AtMostCmp(in.IntLit(0)(src), i0)(src), + in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src), + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(i0, i)(src))(src))(src) + ) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariantsAfter = (if (hasValue) Vector( + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(j, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) + else + Vector()) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + enc = in.Seqn(Vector( + // c := x + singleAss(in.Assignee.Var(c), exp)(rangeExpSrc), + // length := len(c) to save for later since it can change + singleAss(in.Assignee.Var(length), in.Length(c)(src))(src), + in.If( + in.EqCmp(length, in.IntLit(0)(src))(src), + in.Seqn(Vector( + // assume i == i0 + in.Assume(in.ExprAssertion(in.EqCmp(i, i0)(src))(src))(src) + ) ++ + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn(Vector( + // i = 0 + in.Initialization(i)(src), + singleAss(in.Assignee.Var(i), in.IntLit(0)(src))(iSrc), + // i0 = 0 + in.Initialization(i0)(src), + singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++ + // j = c[0] + (if (hasValue) + Vector(in.Initialization(j)(src), singleAss(in.Assignee.Var(j), in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(jSrc)) + else Vector()) ++ + dInvPre ++ dTerPre ++ Vector( + in.While( + in.LessCmp(i0, length)(src), + addedInvariantsBefore ++ dInv ++ addedInvariantsAfter, + dTer, + in.Block(Vector(continueLoopLabelProxy), + Vector( + dBody, + continueLoopLabel, + //i0 += 1 + singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src), + // if i0 < len(c) { i = i0; j = c[i] } + in.If( + in.LessCmp(i0, length)(src), + in.Seqn(Vector(singleAss(in.Assignee.Var(i), i0)(src)) ++ + (if (hasValue) Vector(singleAss(in.Assignee.Var(j), in.IndexedExp(c, i, typ)(src))(src)) else Vector()))(src), + in.Seqn(Vector())(src))(src) + ) ++ + dInvPre ++ + dTerPre + )(src))(src), breakLoopLabel + ) + )(src) + )(src)))(src) + } yield enc)) + + /** + * This case handles for loops with a range clause of the form: + * + * + * for i, j = range x with i0 { + * body + * } + * + * In the case where x is a slice or array the following code is produced. Note + * that everything is in a new block so it can shadow variables with the same + * name declared outside. This is also the go behaviour. + * + * c := x // save the value of the slice/array since changing it doesn't change the iteration + * length := len(c) + * + * if (length == 0) { + * havoc i + * assume i0 == i + * havoc j // [v] + * assert + * } else { + * var i int = 0 + * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 + * var j T = c[0] // [v] + * invariant 0 <= i0 && i0 <= len(c) + * invariant i0 < len(c) ==> i0 == i && j == c[i0] // [v] just the j == c[i0] part + * + * for i0 < length { + * + * i0 += 1 + * if i0 < len(c) { i = i0 ; j = c[i] /* [v] */ } + * } + * } + * + * In the case where the value variable 'j' is missing all the code annotated with [v] + * is omitted + */ + def desugarArrSliceAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + (elemType, typ) = underlyingType(exp.typ) match { + case s: in.SliceT => (s.elems, s) + case a: in.ArrayT => (a.elems, a) + case _ => violation("Expected slice or array in for-range statement") + } + + rangeExpSrc = meta(range.exp, info) + + hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier]) + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + length <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) + + i <- goL(ass(0)) + j <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(c)) + + i0 = leftOfAssignmentNoInit(range.enumerated, info)(in.IntT(Addressability.exclusiveVariable)) + _ <- declare(i0) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + addedInvariantsBefore = Vector( + in.ExprAssertion(in.And( + in.AtMostCmp(in.IntLit(0)(src), i0)(src), + in.AtMostCmp(i0, in.Length(c)(src))(src))(src))(src) + ) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariantsAfter = (if (hasValue) Vector( + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src), + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(j.op, in.IndexedExp(c, i0, typ)(indexValueSrc))(indexValueSrc))(indexValueSrc))(indexValueSrc)) + else + Vector( + in.Implication( + in.LessCmp(i0, in.Length(c)(src))(src), + in.ExprAssertion(in.EqCmp(i0, i.op)(src))(src))(src))) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + enc = in.Seqn(Vector( + // c := x + singleAss(in.Assignee.Var(c), exp)(rangeExpSrc), + // length := len(c) to save for later since it can change + singleAss(in.Assignee.Var(length), in.Length(c)(src))(src), + in.If( + in.EqCmp(length, in.IntLit(0)(src))(src), + in.Seqn( + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn(Vector( + // c := x + singleAss(in.Assignee.Var(c), exp)(rangeExpSrc), + // i = 0 + singleAss(i, in.IntLit(0)(src))(src), + // i0 = 0 + singleAss(in.Assignee.Var(i0), in.IntLit(0)(src))(src)) ++ + // j = c[0] + (if (hasValue) + Vector(singleAss(j, in.IndexedExp(c, in.IntLit(0)(src), typ)(src))(src)) + else Vector()) ++ + dInvPre ++ dTerPre ++ Vector( + in.While( + in.LessCmp(i0, length)(src), + addedInvariantsBefore ++ dInv ++ addedInvariantsAfter, + dTer, + in.Block(Vector(continueLoopLabelProxy), + Vector( + dBody, + continueLoopLabel, + //i0 += 1 + singleAss(in.Assignee.Var(i0), in.Add(i0, in.IntLit(1)(src))(src))(src), + // if i0 < len(c) { i = i0; j = c[i] } + in.If( + in.LessCmp(i0, length)(src), + in.Seqn(Vector(singleAss(i, i0)(src)) ++ + (if (hasValue) Vector(singleAss(j, in.IndexedExp(c, i.op, typ)(src))(src)) else Vector()))(src), + in.Seqn(Vector())(src))(src) + ) ++ + dInvPre ++ + dTerPre + )(src))(src), breakLoopLabel + ) + )(src) + )(src)))(src) + } yield enc)) + + /** + * This case handles for loops with a range clause of a map expression of the form: + * + * + * // visited here is a set containing the already visited keys in the map + * for k, v := range x with visited { + * body + * } + * + * The following code is produced. Note + * that everything is in a new block so it can shadow variables with the same + * name declared outside. This is also the go behaviour. + * + * c := x + * + * if (|c| == 0) { + * var k : T1 + * var v : T2 // [v] + * var visited : Set[T1] + * assert + * } + * else { + * var k : T1 + * var v : T2 // [v] + * inhale k in domain(c) + * v := c[k] // [v] + * var visited : Set[T1] := Set() + * assert 0 / 1 < per // check if permission provided by user is valid + * while (|visited| < |domain(c)|) + * invariant |visited| < |domain(c)| ==> k in domain(x) && v == c[k] // [v] + * invariant |visited| <= |domain(c)| + * invariant visited subset domain(c) + * + * { + * var key : T1 + * inhale key in domain(c) && !(key in visited) + * k := key + * v := x[k] // [v] + * exhale acc(x, 1/100000) + * + * inhale acc(x, 1/100000) + * visited := visited union Set(k) + * + * In the case where the value variable 'v' is missing all the code annotated with [v] + * is omitted + */ + def desugarMapShortRange(n: PShortForRange, range: PRange, shorts: Vector[PUnkLikeId], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src) + + (keyType, valType) = underlyingType(exp.typ) match { + case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable)) + case _ => violation("unexpected type of range expression") + } + visType = in.SetT(keyType, Addressability.exclusiveVariable) + + domain = in.MapKeys(c, underlyingType(exp.typ))(src) + + visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable)) + + perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src) + + initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src) + + exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation()) + + // exhale acc(x, p) + exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc) + inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src) + + hasValue = shorts.length > 1 && !(shorts(1).isInstanceOf[PWildcard]) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariants = Vector( + in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src), + in.ExprAssertion(in.Subset(visited.op, domain)(src))(src)) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp( + in.SetMinus(visited.op, domain)(src), + in.SetLit(keyType, Vector.empty)(src) + )(src))(src))(src) + + k = leftOfAssignmentNoInit(shorts(0), info)(keyType) + v = if (hasValue) leftOfAssignmentNoInit(shorts(1), info)(valType) else k + + updateKeyVal = in.Seqn(Vector( + in.Inhale(in.ExprAssertion(in.And( + in.Contains(k, domain)(src), + in.Negation(in.Contains(k, visited.op)(src))(src))(src))(src))(src) + ) ++ (if (hasValue) Vector(in.Initialization(v)(src), singleAss(in.Assignee.Var(v), in.IndexedExp(c, k, underlyingType(exp.typ))(src))(src)) else Vector()))(src) + + updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k))(src))(src))(src) + + enc = in.Seqn(Vector( + singleAss(in.Assignee.Var(c), exp)(src), + in.If( + in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src), + in.Seqn( + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn( + dInvPre ++ dTerPre ++ Vector( + initPerm, + in.While( + in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src), + dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, k) ++ (if (hasValue) Vector(v) else Vector()), + Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre + )(src))(src), visitedEqDomain, breakLoopLabel + ))(src) + )(src)))(src) + + } yield enc)) + + def desugarMapAssRange(n: PAssForRange, range: PRange, ass: Vector[PAssignee], spec: PLoopSpec, body: PBlock)(src: Source.Parser.Info): Writer[in.Stmt] = unit(block(for { + exp <- goE(range.exp) + + (keyType, valType) = underlyingType(exp.typ) match { + case in.MapT(k, v, _) => (k.withAddressability(Addressability.exclusiveVariable), v.withAddressability(Addressability.exclusiveVariable)) + case _ => violation("unexpected type of range expression") + } + visType = in.SetT(keyType, Addressability.exclusiveVariable) + + c <- freshDeclaredExclusiveVar(exp.typ.withAddressability(Addressability.exclusiveVariable), n, info)(src) + + domain = in.MapKeys(c, underlyingType(exp.typ))(src) + + visited <- leftOfAssignmentD(range.enumerated, info)(in.SetT(keyType, Addressability.exclusiveVariable)) + + perm <- freshDeclaredExclusiveVar(in.PermissionT(Addressability.exclusiveVariable), n, info)(src) + + initPerm = singleAss(in.Assignee.Var(perm), in.PermLit(1, MapExhalePermDenom)(src))(src) + + exhSrc = meta(range.exp, info).createAnnotatedInfo(Source.InsufficientPermissionToRangeExpressionAnnotation()) + + // exhale acc(x, p) + exhalePerm = in.Exhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(exhSrc) + inhalePerm = in.Inhale(in.Access(in.Accessible.ExprAccess(c), perm)(exhSrc))(src) + + hasValue = ass.length > 1 && !(ass(1).isInstanceOf[PBlankIdentifier]) + + (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) + (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) + indexValueSrc = meta(range.exp, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) + addedInvariants = Vector( + in.ExprAssertion(in.AtMostCmp(in.Length(visited.op)(src), in.Length(c)(src))(src))(src), + in.ExprAssertion(in.Subset(visited.op, domain)(src))(src)) + + dBody = blockD(ctx, info)(body) + + // handle break and continue labels + continueLabelName = nm.continueLabel(n, info) + continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) + continueLoopLabel = in.Label(continueLoopLabelProxy)(src) + + breakLabelName = nm.breakLabel(n, info) + breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) + _ <- declare(breakLoopLabelProxy) + breakLoopLabel = in.Label(breakLoopLabelProxy)(src) + + visitedEqDomain = in.Assert(in.ExprAssertion(in.EqCmp( + in.SetMinus(visited.op, domain)(src), + in.SetLit(keyType, Vector.empty)(src) + )(src))(src))(src) + + tempk = in.LocalVar(nm.fresh(n, info), keyType)(src) + k <- goL(ass(0)) + v <- if (hasValue) goL(ass(1)) else unit(in.Assignee.Var(perm)) + + updateKeyVal = in.Seqn(Vector( + in.Inhale(in.ExprAssertion(in.And( + in.Contains(tempk, domain)(src), + in.Negation(in.Contains(tempk, visited.op)(src))(src))(src))(src))(src), + singleAss(k, tempk)(src) + ) ++ (if (hasValue) Vector(singleAss(v, in.IndexedExp(c, k.op, underlyingType(exp.typ))(src))(src)) else Vector()))(src) + + updateVisited = singleAss(visited, in.Union(visited.op, in.SetLit(keyType, Vector(k.op))(src))(src))(src) + + enc = in.Seqn(Vector( + singleAss(in.Assignee.Var(c), exp)(src), + in.If( + in.EqCmp(in.Length(c)(src), in.IntLit(0)(src))(src), + in.Seqn( + // assert + (spec.invariants zip dInv).map[in.Stmt]((x: (PExpression, in.Assertion)) => in.Assert(x._2)(meta(x._1, info).createAnnotatedInfo(Source.LoopInvariantNotEstablishedAnnotation))))(src), + in.Seqn( + dInvPre ++ dTerPre ++ Vector( + initPerm, + in.While( + in.LessCmp(in.Length(visited.op)(src), in.Length(c)(src))(src), + dInv ++ addedInvariants, dTer, in.Block(Vector(continueLoopLabelProxy, tempk), + Vector(exhalePerm, updateKeyVal, dBody, continueLoopLabel, inhalePerm, updateVisited) ++ dInvPre ++ dTerPre + )(src))(src), visitedEqDomain, breakLoopLabel + ))(src) + )(src)))(src) + } yield enc)) + val result = stmt match { case NoGhost(noGhost) => noGhost match { case _: PEmptyStmt => unit(in.Seqn(Vector.empty)(src)) @@ -1284,328 +1794,19 @@ object Desugar { case n@PBreak(label) => unit(in.Break(label.map(x => x.name), nm.fetchBreakLabel(n, info))(src)) - /** - * This case handles for loops with a range clause of the form: - * - * - * for i, j := range x { - * body - * } - * - * In the case where x is a slice or array the following code is produced. Note - * that everything is in a new block so it can shadow variables with the same - * name declared outside. This is also the go behaviour. - * - * var i int = 0 - * var i0 int = 0 // since 'i' can change in the iteration we store the true index in i0 - * var j elem(x) // [v] the type of the elements of x - * - * c := x // save the value of the slice/array since changing it doesn't change the iteration - * - * if (0 <= i && i < len(c)) { // [v] - * j = c[i] - * } - * - * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants do not - * invariant len(c) > 0 ==> i == i0 // require access to anything so they - * invariant len(c) > 0 ==> 0 <= i && i <= len(c) // are added before the user invariants - * 0) and j with f(j, len(c) > 0)> - * invariant len(c) > 0 ==> (0 <= i && i < len(c) ==> j == c[i]) // [v] - * for i < len(c) { - * - * i0 += 1 - * i = i0 - * if (0 <= i && i < len(c)) { // [v] - * j = c[i] - * } - * } - * - * In the case where the value variable 'j' is missing all the code annotated with [v] - * is omitted - * - * Function f is the identity function regarding its first argument with a precondition - * stating that the second argument must be true. - * - * requires b - * decreases _ - * pure func f(x: , b: bool) { x } - * - * It is needed because in the occation of empty slices or arrays, i and j should not exist. - * Replacing them with the call to this function will cause its precondition to fail for - * empty slices or arrays and thus produce the error which is then transformed to the - * desirable one. - */ - case n@PShortForRange(range, shorts, spec, body) => - // is a block as it introduces new variables - unit(block(for { - exp <- goE(range.exp) - (elems, typ) = underlyingType(exp.typ) match { - case slice : in.SliceT => (slice.elems, slice) - case array : in.ArrayT => (array.elems, array) - case _ : in.MapT => violation("Maps are not supported yet in range") - case _ : in.StringT => violation("Strings are not supported yet in range") - case t => violation(s"Range not applicable to type $t") - } + case n@PShortForRange(range, shorts, _, spec, body) => + underlyingType(info.typ(range.exp)) match { + case _: SliceT | _: ArrayT => desugarArrSliceShortRange(n, range, shorts, spec, body)(src) + case _: MapT => desugarMapShortRange(n, range, shorts, spec, body)(src) + case t => violation(s"Type $t not supported as a range expression") + } - // index is the place where we store the indices of the range expression - rangeSrc = meta(range, info) - rangeExpSrc = meta(range.exp, info) - indexSrc = meta(shorts(0), info) - - indexLeft <- leftOfAssignmentD(shorts(0), info)(in.IntT(Addressability.exclusiveVariable)) - copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) - copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc) - incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc) - - indexVar = in.Assignee.Var(indexLeft.op.asInstanceOf[in.AssignableVar]) - incrIndex = singleAss(indexVar, copiedIndexVar)(indexSrc) - indexAss = singleAss(indexVar, in.IntLit(0)(rangeSrc))(indexSrc) - - // in go the range expression is only computed once before the iteration begins - // we do that by storing it in copiedVar - // this also ensures that the elements iterated through do not change - // even if the range expression is modified in the loop body - copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc) - copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc) - - // get the length of the expression - length = in.Length(copiedVar)(rangeSrc) - cond = in.LessCmp(indexLeft.op, length)(rangeSrc) - - // this invariant states that the index variable has the same value as the hidden index variable always - copiedIndexEqualsIndexInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc) - - // this invariant states that the hidden index stays within 0 and the length of the array/slice (both inclusive) - copiedIndexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc), - in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - // this invariant states that the index is between 0 and the length of the array/slice (both inclusive) - indexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc), - in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) - - dBody = blockD(ctx, info)(body) - - continueLabelName = nm.continueLabel(n, info) - continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) - continueLoopLabel = in.Label(continueLoopLabelProxy)(src) - - breakLabelName = nm.breakLabel(n, info) - breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) - _ <- declare(breakLoopLabelProxy) - breakLoopLabel = in.Label(breakLoopLabelProxy)(src) - - wh = if (shorts.length == 2) { - // in this case we know that the loop looks like this: - // for i, j := range x { ... - // until now we have only created the variable i since it is not mandatory for j to exist - // if it does, we have to declare it and add the code that will update it in each iteration - // which looks like this: - // if (0 <= i && i < length(x)) { j = x[i] } - // note that this will happen after we have incremented i - val valueSrc = meta(shorts(1), info) - val valueLeft = assignableVarD(ctx, info)(shorts(1)) match { - case Left(n) => n - case Right(n) => n - } - val valueVar = in.Assignee.Var(valueLeft.asInstanceOf[in.AssignableVar]) - val valueAss = singleAss(valueVar, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc) - val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc) - - val invCtx = ctx.copyWithExpD{ - case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name => - val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString())) - Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc))) - case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(1).name => - val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString())) - Some(unit(conditionalId(valueLeft, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), elems)(invSrc))) - case _ => None - } - val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res - // we also need an invariant that states that - // for index i and value j and range expression x - // invariant len(c) > 0 ==> 0 <= i && i < len(x) ==> j == x[i] - val indexValueSrc = meta(range, info).createAnnotatedInfo(Source.NoPermissionToRangeExpressionAnnotation()) - val indexValueEq = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.Implication( - in.And( - in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc), - in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc), - in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft)(rangeExpSrc))(rangeExpSrc) - )(rangeSrc))(indexValueSrc) - in.Block( - Vector(valueLeft.asInstanceOf[in.LocalVar]), - Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv ++ Vector(indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } else { - // else we do not have a value variable and the while loop has only - // the index in bounds invariant added - // the loop in this case looks like this: - // for i := range x { ... - val invCtx = ctx.copyWithExpD{ - case n@PNamedOperand(_@PIdnUse(name)) if name == shorts(0).name => - val invSrc = meta(info.enclosingInvariantNode(n), info).createAnnotatedInfo(Source.RangeVariableMightNotExistAnnotation(range.exp.toString())) - Some(unit(conditionalId(indexLeft.op, in.LessCmp(in.IntLit(0)(invSrc), length)(invSrc), in.IntT(Addressability.exclusiveVariable))(invSrc))) - case _ => None - } - val (dInvPre, dInv) = prelude(sequence(spec.invariants map assertionD(invCtx, info))).res - in.Seqn( - Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv) ++ dInv, dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } - } yield wh)) - - /** - * This case handles for loops with a range clause of the form: - * - * - * for expIndex, expValue = range x { - * body - * } - * - * In the case where x is a slice or array the following code is produced. - * - * var i0 int = 0 // since 'expIndex' can change in the iteration we store the true index in i0 - * - * c := x // save the value of the slice/array since changing it doesn't change the iteration - * - * if (len(c) > 0) { - * expIndex = 0 - * } - * - * if (0 <= expIndex && expIndex < len(c)) { // [v] - * expValue = c[expIndex] - * } - * - * 0) and j with f(j, len(c) > 0)> - * invariant len(c) > 0 ==> 0 <= i0 && i0 <= len(c) // these invariants might require access to something - * invariant len(c) > 0 ==> expIndex == i0 // as expIndex can be an indexing operation for example - * invariant len(c) > 0 ==> 0 <= expIndex && expIndex <= len(c) // so they are added after the user invariants - * invariant len(c) > 0 ==> (0 <= expIndex && expIndex < len(c) ==> expValue == c[expIndex]) // [v] - * for expIndex < len(c) { - * - * i0 += 1 - * expIndex = i0 - * if (0 <= expIndex && expIndex < len(c)) { // [v] - * expValue = c[i] - * } - * } - * - * In the case where the value expression 'expValue' is missing all the code annotated with [v] - * is omitted - */ case n@PAssForRange(range, ass, spec, body) => - unit(block(for { - exp <- goE(range.exp) - typ = underlyingType(exp.typ) match { - case slice : in.SliceT => slice - case array : in.ArrayT => array - case _ : in.MapT => violation("Maps are not supported yet in range") - case _ : in.StringT => violation("Strings are not supported yet in range") - case t => violation(s"Range not applicable to type $t") - } - indexLeft <- goL(ass(0)) - rangeSrc = meta(range, info) - indexSrc = meta(ass(0), info) - rangeExpSrc = meta(range.exp, info) - - copiedVar <- freshDeclaredExclusiveVar(exp.typ, n, info)(rangeExpSrc) - copyAss = singleAss(in.Assignee.Var(copiedVar), exp)(rangeExpSrc) - length = in.Length(copiedVar)(rangeSrc) - - copiedIndexVar <- freshDeclaredExclusiveVar(in.IntT(Addressability.exclusiveVariable), n, info)(rangeExpSrc) - copyIndexAss = singleAss(in.Assignee.Var(copiedIndexVar), in.IntLit(0)(indexSrc))(rangeExpSrc) - incrCopiedIndex = singleAss(in.Assignee.Var(copiedIndexVar), in.Add(copiedIndexVar, in.IntLit(1)(indexSrc))(indexSrc))(indexSrc) - - indexAss = in.If(in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), singleAss(indexLeft, in.IntLit(0)(rangeSrc))(indexSrc), in.Seqn(Vector())(indexSrc))(indexSrc) - incrIndex = singleAss(indexLeft, copiedIndexVar)(indexSrc) - - cond = in.LessCmp(indexLeft.op, length)(rangeSrc) - - copiedIndexEqualsIndexInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.EqCmp(indexLeft.op, copiedIndexVar)(rangeSrc))(rangeSrc))(rangeSrc) - - copiedIndexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), copiedIndexVar)(rangeSrc), - in.AtMostCmp(copiedIndexVar, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - indexBoundsInv = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.ExprAssertion(in.And( - in.AtMostCmp(in.IntLit(0)(rangeSrc), indexLeft.op)(rangeSrc), - in.AtMostCmp(indexLeft.op, length)(rangeSrc))(rangeSrc))(rangeSrc))(rangeSrc) - - (dInvPre, dInv) <- prelude(sequence(spec.invariants map assertionD(ctx, info))) - (dTerPre, dTer) <- prelude(option(spec.terminationMeasure map terminationMeasureD(ctx, info))) - - dBody = blockD(ctx, info)(body) - - continueLabelName = nm.continueLabel(n, info) - continueLoopLabelProxy = in.LabelProxy(continueLabelName)(src) - continueLoopLabel = in.Label(continueLoopLabelProxy)(src) - - breakLabelName = nm.breakLabel(n, info) - breakLoopLabelProxy = in.LabelProxy(breakLabelName)(src) - _ <- declare(breakLoopLabelProxy) - breakLoopLabel = in.Label(breakLoopLabelProxy)(src) - - wh = if (ass.length == 2) { - val valueLeft = goL(ass(1)).res - val decls = ass(1) match { - case _: PBlankIdentifier => Vector(valueLeft.asInstanceOf[in.Assignee.Var].op.asInstanceOf[in.LocalVar]) - case _ => Vector.empty - } - val valueSrc = meta(ass(1), info) - val valueAss = singleAss(valueLeft, in.IndexedExp(copiedVar, indexLeft.op, typ)(valueSrc))(valueSrc) - val updateValue = in.If(in.And(cond, in.AtLeastCmp(indexLeft.op, in.IntLit(0)(valueSrc))(valueSrc))(valueSrc), valueAss, in.Seqn(Vector())(valueSrc))(valueSrc) - - val indexValueEq = in.Implication( - in.LessCmp(in.IntLit(0)(indexSrc), length)(indexSrc), - in.Implication( - in.And( - in.AtMostCmp(in.IntLit(0)(indexSrc), indexLeft.op)(indexSrc), - in.LessCmp(indexLeft.op, length)(indexSrc))(indexSrc), - in.ExprAssertion(in.EqCmp(in.IndexedExp(copiedVar, indexLeft.op, typ)(rangeExpSrc), valueLeft.op)(rangeExpSrc))(rangeExpSrc) - )(rangeSrc))(rangeSrc) - in.Block( - decls, - Vector(copyAss, indexAss, copyIndexAss, updateValue) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv, indexValueEq), dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex, updateValue) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } else { - in.Seqn( - Vector(copyAss, indexAss, copyIndexAss) ++ dInvPre ++ dTerPre ++ Vector( - in.While(cond, dInv ++ Vector(copiedIndexBoundsInv, copiedIndexEqualsIndexInv, indexBoundsInv), dTer, in.Block(Vector(continueLoopLabelProxy), - Vector(dBody, continueLoopLabel, incrCopiedIndex, incrIndex) ++ dInvPre ++ dTerPre - )(src))(src), breakLoopLabel - ) - )(src) - } - } yield wh)) + underlyingType(info.typ(range.exp)) match { + case _: SliceT | _: ArrayT => desugarArrSliceAssRange(n, range, ass, spec, body)(src) + case _: MapT => desugarMapAssRange(n, range, ass, spec, body)(src) + case t => violation(s"Type $t not supported as a range expression") + } case _ => ??? } @@ -3282,58 +3483,6 @@ object Desugar { fPred } - /** - * Holds types for which conditionalId functions have been declared for. - * This way conditionalId functions do not get declared twice for the same - * type. - */ - private var hasConditionalIdForType : Set[in.Type] = Set.empty - - /** - * If it doesn't exist it generates a function: - * - * function $conditionalId(value: , cond: Bool): Int - * requires cond - * { - * value - * } - * - * where type is the underlying type of param generalType - * - * @param valueVar - * @param condVar - * @param generalType - * @param src - * @return a call to the $conditionalId function with arguments valueVar and condVar - */ - private def conditionalId(valueVar: in.Expr, condVar: in.Expr, generalType: in.Type)(src: Meta): in.PureFunctionCall = { - val typ = underlyingType(generalType) - val name = in.FunctionProxy("$" + s"conditionalId${Names.serializeType(typ)}")(Source.Parser.Internal) - if (!hasConditionalIdForType(typ)) { - hasConditionalIdForType += typ - val value = in.Parameter.In("value", typ.withAddressability(Addressability.inParameter))(Source.Parser.Internal) - val cond = in.Parameter.In("cond", in.BoolT(Addressability.inParameter))(Source.Parser.Internal) - val res = in.Parameter.Out("res", typ.withAddressability(Addressability.outParameter))(Source.Parser.Internal) - val args = Vector(value, cond) - val results = Vector(res) - val pres = Vector(in.ExprAssertion(cond)(Source.Parser.Internal)) - val posts = Vector[in.Assertion]() - val terminationMeasures = Vector(in.WildcardMeasure(None)(Source.Parser.Internal)) - val body = Some(value) - AdditionalMembers.addMember( - in.PureFunction( - name, - args, - results, - pres, - posts, - terminationMeasures, - body)(Source.Parser.Internal) - ) - } - in.PureFunctionCall(name, Vector(valueVar, condVar), in.IntT(Addressability.callResult))(src) - } - /** Desugar the function literal and add it to the map. */ private def registerFunctionLit(ctx: FunctionContext, info: TypeInfo)(lit: PFunctionLit): Writer[in.Expr] = { val fLit = if (lit.spec.isPure) pureFunctionLitD(ctx, info)(lit) else functionLitD(ctx)(lit) diff --git a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala index 88c31a6ba..5745091ec 100644 --- a/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala +++ b/src/main/scala/viper/gobra/frontend/ParseTreeTranslator.scala @@ -1821,18 +1821,25 @@ class ParseTreeTranslator(pom: PositionManager, source: Source, specOnly : Boole val post = visitNodeOrNone[PSimpleStmt](ctx.forClause().postStmt) PForStmt(pre, cond, post, spec, block).at(specCtx) } else if (has(ctx.rangeClause())) { - // for ? range - val expr = visitNode[PExpression](ctx.rangeClause().expression()) - val range = PRange(expr).at(ctx.rangeClause()) + // for ? range (with enumerated)? + val expr = visitNode[PExpression](ctx.rangeClause().expression()).at(ctx.rangeClause()) + // enumerated will be used no matter what, so we just make it a wildcard if it is not + // present in the range clause + val enumerated = visitChildren(ctx.rangeClause()) match { + case Vector(_, _, "range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER()) + case Vector("range", _, "with", i) if i.toString() == "_" => PWildcard().at(ctx.rangeClause().IDENTIFIER()) + case Vector(_, _, "range", _) | Vector("range", _) => PWildcard().at(ctx.rangeClause()) + case _ => idnUnk.get(ctx.rangeClause().IDENTIFIER()).at(ctx.rangeClause.IDENTIFIER()) + } + val range = PRange(expr, enumerated).at(ctx.rangeClause()) if (has(ctx.rangeClause().DECLARE_ASSIGN())) { // := - // identifiers should include the blank identifier, but this is currently not supported by PShortForRange - val goIdnUnkList(idList) = visitIdentifierList(ctx.rangeClause().identifierList()) - PShortForRange(range, idList, spec, block).at(specCtx) + val (idnUnkLikeList(vars), addressable) = visitMaybeAddressableIdentifierList(ctx.rangeClause().maybeAddressableIdentifierList()) + PShortForRange(range, vars, addressable, spec, block).at(specCtx) } else { // = val assignees = visitAssigneeList(ctx.rangeClause().expressionList()) match { - case v : Vector[PAssignee] => v + case v : Vector[PAssignee] => if (v.length > 0 ) v else Vector(PBlankIdentifier().at(ctx.rangeClause())) case _ => fail(ctx) } PAssForRange(range, assignees, spec, block).at(specCtx) diff --git a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala index fc350c4c5..2b30e5e43 100644 --- a/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala +++ b/src/main/scala/viper/gobra/frontend/info/base/SymbolTable.scala @@ -142,6 +142,11 @@ object SymbolTable extends Environments[Entity] { override def rep: PNode = exp } + case class RangeEnumerateVariable(exp: PRange, ghost: Boolean, context: ExternalTypeInfo) extends ActualVariable { + override def addressable: Boolean = false + override def rep: PNode = exp + } + sealed trait TypeEntity extends Regular sealed trait ActualTypeEntity extends TypeEntity with ActualRegular { diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala index d2adce9ac..743cfd2b7 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/resolution/NameResolution.scala @@ -115,7 +115,7 @@ trait NameResolution { case decl: PShortForRange => val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2 - RangeVariable(idx, decl.range, isGhost, addressable = false, this) // TODO: check if range variables are addressable in Go + RangeVariable(idx, decl.range, isGhost, addressable = decl.addressable(idx), this) case decl: PSelectShortRecv => val idx = decl.shorts.zipWithIndex.find(_._1 == id).get._2 @@ -126,6 +126,8 @@ trait NameResolution { case AssignMode.Multi => MultiLocalVariable(idx, decl.recv, isGhost, addressable = false, this) case _ => UnknownEntity() } + case decl: PRange => + RangeEnumerateVariable(decl, isGhost, this) case _ => violation("unexpected parent of unknown id") } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala index f09caf7fe..513c3eb89 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/IdTyping.scala @@ -128,6 +128,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => } }) + case _:RangeEnumerateVariable => LocalMessages(noMessages) + case Field(PFieldDecl(_, typ), _, _) => unsafeMessage(! { wellDefAndType.valid(typ) }) @@ -231,6 +233,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case t => violation(s"expected tuple but got $t") } + case RangeEnumerateVariable(range, _, context) => rangeEnumeratorType(underlyingType(context.typ(range.exp))) + case Field(PFieldDecl(_, typ), _, context) => context.symbType(typ) case Embbed(PEmbeddedDecl(typ, _), _, context) => context.typ(typ) @@ -269,7 +273,8 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => def getBlankAssigneeTypeRange(n: PNode, left: Vector[PNode], range: PRange): Type = { require(n.isInstanceOf[PIdnNode] || n.isInstanceOf[PBlankIdentifier]) val pos = left indexWhere (n eq _) - exprType(range.exp) match { + violation(pos >= 0, "did not find expression corresponding to " + n) + underlyingType(exprType(range.exp)) match { case ChannelT(elem, ChannelModus.Recv | ChannelModus.Bi) => elem case _ => miscType(range).asInstanceOf[InternalSingleMulti].mul.ts(pos) } @@ -281,9 +286,18 @@ trait IdTyping extends BaseTyping { this: TypeInfoImpl => case PShortVarDecl(right, left, _) => getBlankAssigneeType(w, left, right) case PVarDecl(typ, right, left, _) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right)) case PConstSpec(typ, right, left) => typ.map(symbType).getOrElse(getBlankAssigneeType(w, left, right)) + case PShortForRange(range, shorts, _, _, _) => getBlankAssigneeTypeRange(w, shorts, range) + case PRange(exp, enumerated) => if (w eq enumerated) rangeEnumeratorType(underlyingType(exprType(exp))) + else violation("did not find expression corresponding to " + w) case _ => ??? } case _ => ??? } } + + def rangeEnumeratorType(typ: Type) : Type = typ match { + case _: SliceT | _: ArrayT => IntT(config.typeBounds.Int) + case MapT(key, _) => SetT(key) + case t => violation(s"type $t is not supported for range") + } } diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala index 639b5d74a..059966248 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/MiscTyping.scala @@ -24,9 +24,9 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def wellDefActualMisc(misc: PActualMisc): Messages = misc match { - case n@PRange(exp) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match { - case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | - _: MapT | ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages + case n@PRange(exp, _) => isExpr(exp).out ++ (underlyingType(exprType(exp)) match { + case _: ArrayT | PointerT(_: ArrayT) | _: SliceT | _: GhostSliceT | _: MapT | + ChannelT(_, ChannelModus.Recv | ChannelModus.Bi) => noMessages case t => message(n, s"type error: got $t but expected rangeable type") }) @@ -50,7 +50,7 @@ trait MiscTyping extends BaseTyping { this: TypeInfoImpl => private[typing] def actualMiscType(misc: PActualMisc): Type = misc match { - case PRange(exp) => underlyingType(exprType(exp)) match { + case PRange(exp, _) => underlyingType(exprType(exp)) match { case ArrayT(_, elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case PointerT(ArrayT(_, elem)) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) case SliceT(elem) => InternalSingleMulti(IntT(config.typeBounds.Int), InternalTupleT(Vector(IntT(config.typeBounds.Int), elem))) diff --git a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala index c008753a7..ad6c39039 100644 --- a/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala +++ b/src/main/scala/viper/gobra/frontend/info/implementation/typing/StmtTyping.scala @@ -8,7 +8,7 @@ package viper.gobra.frontend.info.implementation.typing import org.bitbucket.inkytonik.kiama.util.Messaging.{Messages, error, noMessages} import viper.gobra.ast.frontend._ -import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type} +import viper.gobra.frontend.info.base.Type.{BooleanT, ChannelModus, ChannelT, FunctionT, InterfaceT, InternalTupleT, Type, ArrayT, SliceT, MapT, SetT} import viper.gobra.frontend.info.implementation.TypeInfoImpl trait StmtTyping extends BaseTyping { this: TypeInfoImpl => @@ -101,11 +101,22 @@ trait StmtTyping extends BaseTyping { this: TypeInfoImpl => case n@PForStmt(_, cond, _, _, _) => isExpr(cond).out ++ comparableTypes.errors(exprType(cond), BooleanT)(n) - case _@PShortForRange(range, shorts, _, _) => - multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) + case PShortForRange(range, shorts, _, _, _) => + underlyingType(exprType(range.exp)) match { + case _ : ArrayT | _ : SliceT => + multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++ + assignableTo.errors(miscType(range), idType(range.enumerated))(range) + case MapT(key, _) => multiAssignableTo.errors(Vector(miscType(range)), shorts map idType)(range) ++ + assignableTo.errors((SetT(key), idType(range.enumerated)))(range) + case t => error(range, s"range not supported for type $t") + } - case _@PAssForRange(range, ass, _, _) => - multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range) + case PAssForRange(range, ass, _, _) => + underlyingType(exprType(range.exp)) match { + case _ : ArrayT | _ : SliceT | _ : MapT => + multiAssignableTo.errors(Vector(miscType(range)), ass map exprType)(range) + case t => error(range, s"range not supported for type $t") + } case n@PGoStmt(exp) => isExpr(exp).out ++ isExecutable.errors(exp)(n) diff --git a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala index 57bed8f49..2cc79ddc3 100644 --- a/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala +++ b/src/main/scala/viper/gobra/reporting/DefaultErrorBackTranslator.scala @@ -6,7 +6,7 @@ package viper.gobra.reporting -import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, RangeVariableMightNotExistAnnotation} +import viper.gobra.reporting.Source.{AutoImplProofAnnotation, CertainSource, CertainSynthesized, ImportPreNotEstablished, MainPreNotEstablished, OverflowCheckAnnotation, ReceiverNotNilCheckAnnotation, InsufficientPermissionToRangeExpressionAnnotation, LoopInvariantNotEstablishedAnnotation} import viper.gobra.reporting.Source.Verifier./ import viper.silver @@ -86,7 +86,6 @@ object DefaultErrorBackTranslator { val transformVerificationErrorReason: VerificationErrorReason => VerificationErrorReason = { case AssertionFalseError(info / OverflowCheckAnnotation) => OverflowErrorReason(info) case AssertionFalseError(info / ReceiverNotNilCheckAnnotation) => InterfaceReceiverIsNilReason(info) - case AssertionFalseError(info / RangeVariableMightNotExistAnnotation(_)) => AssertionFalseError(info) case x => x } @@ -170,8 +169,6 @@ class DefaultErrorBackTranslator( case _ / AutoImplProofAnnotation(subT, superT) => GeneratedImplementationProofError(subT, superT, x) - case _ / RangeVariableMightNotExistAnnotation(rangeExpr) => - x.reasons.foldLeft(RangeVariableMightNotExistError(x.info)(rangeExpr): VerificationError){ case (err, reason) => err dueTo reason } case _ / MainPreNotEstablished => x.reasons.foldLeft(MainPreconditionNotEstablished(x.info): VerificationError){ case (err, reason) => err dueTo reason @@ -182,6 +179,12 @@ class DefaultErrorBackTranslator( case (err, reason) => err dueTo reason } + case _ / InsufficientPermissionToRangeExpressionAnnotation() => + x.reasons.foldLeft(InsufficientPermissionToRangeExpressionError(x.info): VerificationError){ case (err, reason) => err dueTo reason } + + case _ / LoopInvariantNotEstablishedAnnotation => + x.reasons.foldLeft(LoopInvariantEstablishmentError(x.info): VerificationError) { case (err, reason) => err dueTo reason } + case _ => x } diff --git a/src/main/scala/viper/gobra/reporting/Source.scala b/src/main/scala/viper/gobra/reporting/Source.scala index 269eae872..6204aa50d 100644 --- a/src/main/scala/viper/gobra/reporting/Source.scala +++ b/src/main/scala/viper/gobra/reporting/Source.scala @@ -29,8 +29,9 @@ object Source { case object ReceiverNotNilCheckAnnotation extends Annotation case object ImportPreNotEstablished extends Annotation case object MainPreNotEstablished extends Annotation + case object LoopInvariantNotEstablishedAnnotation extends Annotation case class NoPermissionToRangeExpressionAnnotation() extends Annotation - case class RangeVariableMightNotExistAnnotation(rangeExpr: String) extends Annotation + case class InsufficientPermissionToRangeExpressionAnnotation() extends Annotation case class AutoImplProofAnnotation(subT: String, superT: String) extends Annotation object Parser { diff --git a/src/main/scala/viper/gobra/reporting/VerifierError.scala b/src/main/scala/viper/gobra/reporting/VerifierError.scala index 3e79d20dc..87bc18724 100644 --- a/src/main/scala/viper/gobra/reporting/VerifierError.scala +++ b/src/main/scala/viper/gobra/reporting/VerifierError.scala @@ -286,7 +286,12 @@ case class RangeVariableMightNotExistError(info: Source.Verifier.Info)(rangeExpr case class NoPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError { override def localId: String = "no_permission_to_range_expression" - override def localMessage: String = s"Might not have read permissions to range expression" + override def localMessage: String = s"Might not have read permission to range expression" +} + +case class InsufficientPermissionToRangeExpressionError(info: Source.Verifier.Info) extends VerificationError { + override def localId: String = "insufficient_permission_to_range_expression" + override def localMessage: String = s"Range expression should be immutable inside the loop body" } case class MapMakePreconditionError(info: Source.Verifier.Info) extends VerificationError { diff --git a/src/test/resources/regressions/features/loops/range-fail1.gobra b/src/test/resources/regressions/features/loops/range-fail1.gobra index 1529584b4..6bc8e2c97 100644 --- a/src/test/resources/regressions/features/loops/range-fail1.gobra +++ b/src/test/resources/regressions/features/loops/range-fail1.gobra @@ -6,6 +6,6 @@ package pkg func foo_arr() { x := [4]uint{1, 2, 3, 4} //:: ExpectedOutput(type_error) - for i, j, k := range x { + for i, j, k := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail2.gobra b/src/test/resources/regressions/features/loops/range-fail2.gobra index f202fa721..f215873b0 100644 --- a/src/test/resources/regressions/features/loops/range-fail2.gobra +++ b/src/test/resources/regressions/features/loops/range-fail2.gobra @@ -6,6 +6,6 @@ package pkg func foo_arr() { x := []uint{1, 2, 3, 4} //:: ExpectedOutput(no_permission_to_range_expression) - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail3.gobra b/src/test/resources/regressions/features/loops/range-fail3.gobra index f2ea52d51..4a2aaf470 100644 --- a/src/test/resources/regressions/features/loops/range-fail3.gobra +++ b/src/test/resources/regressions/features/loops/range-fail3.gobra @@ -8,6 +8,6 @@ func foo_arr() { var i int var j int //:: ExpectedOutput(type_error) - for i, j = range x { + for i, j = range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail4.gobra b/src/test/resources/regressions/features/loops/range-fail4.gobra index 82becb70f..fe4f2a129 100644 --- a/src/test/resources/regressions/features/loops/range-fail4.gobra +++ b/src/test/resources/regressions/features/loops/range-fail4.gobra @@ -8,6 +8,6 @@ func foo_arr() { var i uint var j uint //:: ExpectedOutput(type_error) - for i, j = range x { + for i, j = range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail5.gobra b/src/test/resources/regressions/features/loops/range-fail5.gobra index 836095d32..d4e05c3fc 100644 --- a/src/test/resources/regressions/features/loops/range-fail5.gobra +++ b/src/test/resources/regressions/features/loops/range-fail5.gobra @@ -9,6 +9,6 @@ func foo_arr() { var j uint var k int //:: ExpectedOutput(type_error) - for i, j, k = range x { + for i, j, k = range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail6.gobra b/src/test/resources/regressions/features/loops/range-fail6.gobra index 3fdacf5b8..37b2b4f0a 100644 --- a/src/test/resources/regressions/features/loops/range-fail6.gobra +++ b/src/test/resources/regressions/features/loops/range-fail6.gobra @@ -6,6 +6,6 @@ package pkg func foo_arr() { x := 0 //:: ExpectedOutput(type_error) - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail7.gobra b/src/test/resources/regressions/features/loops/range-fail7.gobra index 02aaa778b..a3a1473c8 100644 --- a/src/test/resources/regressions/features/loops/range-fail7.gobra +++ b/src/test/resources/regressions/features/loops/range-fail7.gobra @@ -7,6 +7,6 @@ func foo() { x := [0]int{} //:: ExpectedOutput(invariant_establishment_error) invariant false - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range-fail8.gobra b/src/test/resources/regressions/features/loops/range-fail8.gobra index f71ffffaf..1decd510e 100644 --- a/src/test/resources/regressions/features/loops/range-fail8.gobra +++ b/src/test/resources/regressions/features/loops/range-fail8.gobra @@ -6,8 +6,8 @@ package pkg func foo_arr() { x := []uint{} invariant acc(x) - //:: ExpectedOutput(range_variable_might_not_exist:assertion_error) + //:: ExpectedOutput(invariant_establishment_error) invariant i == 0 - for i, j := range x { + for i, j := range x with i0 { } } diff --git a/src/test/resources/regressions/features/loops/range1.gobra b/src/test/resources/regressions/features/loops/range1.gobra index fa290797b..24d426be5 100644 --- a/src/test/resources/regressions/features/loops/range1.gobra +++ b/src/test/resources/regressions/features/loops/range1.gobra @@ -12,9 +12,9 @@ func foo(x []uint) (max uint) { max = x[0] invariant acc(x) invariant 0 <= i && i <= len(x) - invariant forall k int :: 0 <= k && k < i ==> max >= x[k] - decreases len(x) - i - for i, j := range x { + invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k] + decreases len(x) - i0 + for i, j := range x with i0 { if j > max { max = j } @@ -25,8 +25,8 @@ func foo_arr() { x := [4]uint{1, 2, 3, 4} max := x[0] invariant 0 <= i && i <= len(x) - invariant forall k int :: 0 <= k && k < i ==> max >= x[k] - for i, j := range x { + invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k] + for i, j := range x with i0 { if j > max { max = j } @@ -45,10 +45,9 @@ func bar2() { x := []int{1, 2, 3, 4, 5} sum := 0 invariant acc(x) - invariant 0 <= i && i <= len(x) - invariant sum == i * (i - 1) / 2 - decreases len(x) - i - for i := range x { + invariant sum == i0 * (i0 - 1) / 2 + decreases len(x) - i0 + for i := range x with i0 { sum += i } assert sum == len(x) * (len(x) - 1) / 2 @@ -60,24 +59,24 @@ func foo2() { for _, j := range x { } invariant acc(x) - for i, _ := range x { + for i, _ := range x with i0 { } invariant acc(x) for _, _ := range x { } invariant acc(x) - for _ := range x { + for _ := range x with _ { } } func foo3() { x := [0]int{} - for i, j := range x { + for i, j := range x with i0 { } y := []int{} - for i, j := range x { + for i, j := range x with i0 { } - for i,j := range x { + for i, j := range x { continue break } diff --git a/src/test/resources/regressions/features/loops/range2.gobra b/src/test/resources/regressions/features/loops/range2.gobra index b49f5b800..f81c0c52c 100644 --- a/src/test/resources/regressions/features/loops/range2.gobra +++ b/src/test/resources/regressions/features/loops/range2.gobra @@ -15,10 +15,9 @@ func foo() { // this invariant is also automatically generated but // only after the next one which causes the next one to fail // in such a case, the user must provide it himself - invariant 0 <= z[1] && z[1] <= len(x) - invariant forall k int :: 0 <= k && k < z[1] ==> max >= x[k] - decreases len(x) - z[1] - for z[1], y[2] = range x { + invariant forall k int :: 0 <= k && k < i0 ==> max >= x[k] + decreases len(x) - i0 + for z[1], y[2] = range x with i0 { if y[2] > max { max = y[2] } @@ -32,20 +31,20 @@ func foo2() { var i uint var j int invariant acc(x) - decreases len(x) - j - for j, _ = range x { + decreases len(x) - i0 + for j, _ = range x with i0 { } invariant acc(x) - for _ = range x { + for _ = range x with _ { } invariant acc(x) for _, i = range x { } invariant acc(x) - for j = range x { + for j = range x with i0 { } invariant acc(x) - for _ = range x { + for _ = range x with i0 { continue break } diff --git a/src/test/resources/regressions/features/loops/range3.gobra b/src/test/resources/regressions/features/loops/range3.gobra new file mode 100644 index 000000000..39ea0e1e3 --- /dev/null +++ b/src/test/resources/regressions/features/loops/range3.gobra @@ -0,0 +1,29 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func foo() { + x := []int{1,2,3} + invariant acc(&info) + invariant acc(x) + for _, info@ := range x with i { + bar(&info) + } +} + +func foo1() { + x := []int{1,2,3} + info@ := 0 + invariant acc(&info) + invariant acc(x) + for _, info = range x with i { + bar(&info) + } +} + +requires acc(i) +ensures acc(i) +func bar(i *int) { + *i = 3 +} diff --git a/src/test/resources/regressions/features/loops/range_maps-fail1.gobra b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra new file mode 100644 index 000000000..0d8030366 --- /dev/null +++ b/src/test/resources/regressions/features/loops/range_maps-fail1.gobra @@ -0,0 +1,13 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + +func foo() { + x := map[uint]int{1:1, 2:3} + var i int + var j int + //:: ExpectedOutput(type_error) + for i, j = range x with i0 { + } +} diff --git a/src/test/resources/regressions/features/loops/range_maps1.gobra b/src/test/resources/regressions/features/loops/range_maps1.gobra new file mode 100644 index 000000000..f065e5c1e --- /dev/null +++ b/src/test/resources/regressions/features/loops/range_maps1.gobra @@ -0,0 +1,55 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package pkg + + +requires acc(x) +requires len(x) > 0 +ensures acc(x) +ensures forall k uint :: k in domain(x) ==> max >= k +decreases +func foo(x map[uint]int) (max uint) { + max = 0 + invariant acc(x) + invariant forall i uint :: i in visited ==> max >= i + decreases len(domain(x)) - len(visited) + for k, v := range x with visited { + if k > max { + max = k + } + } +} + +decreases +func bar() { + x := map[uint]int{1:1, 2:2, 3:3} + m := foo(x) + assert forall i uint :: i in domain(x) ==> m >= i +} + +requires acc(x) +requires len(x) > 0 +ensures acc(x) +ensures forall k int :: k in domain(x) ==> max >= x[k] +decreases +func foo1(x map[int]uint) (max uint) { + max = 0 + var k int + var v uint + invariant acc(x) + invariant forall i int :: i in visited ==> max >= x[i] + decreases len(domain(x)) - len(visited) + for k, v = range x with visited { + if v > max { + max = v + } + } +} + +decreases +func bar1() { + x := map[int]uint{1:1, 2:2, 3:3} + m := foo1(x) + assert forall i int :: i in domain(x) ==> m >= x[i] +}