// Generated from src/Python3Parser.g4 by ANTLR 4.13.1
import java.util.List;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.misc.*;
import org.antlr.v4.runtime.tree.*;

@SuppressWarnings({ "all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue" })
public class Python3Parser extends Python3ParserBase {
    static {
        RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION);
    }

    protected static final DFA[] _decisionToDFA;
    protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache();
    public static final int INDENT = 1,
            DEDENT = 2,
            STRING = 3,
            NUMBER = 4,
            AND = 5,
            AS = 6,
            DEF = 7,
            ELIF = 8,
            ELSE = 9,
            FALSE = 10,
            FOR = 11,
            FROM = 12,
            IF = 13,
            IMPORT = 14,
            IN = 15,
            IS = 16,
            NONE = 17,
            NOT = 18,
            OR = 19,
            RETURN = 20,
            TRUE = 21,
            UNDERSCORE = 22,
            WHILE = 23,
            NEWLINE = 24,
            NAME = 25,
            DECIMAL_INTEGER = 26,
            FLOAT_NUMBER = 27,
            DOT = 28,
            ELLIPSIS = 29,
            STAR = 30,
            OPEN_PAREN = 31,
            CLOSE_PAREN = 32,
            COMMA = 33,
            COLON = 34,
            SEMI_COLON = 35,
            POWER = 36,
            ASSIGN = 37,
            OPEN_BRACK = 38,
            CLOSE_BRACK = 39,
            OR_OP = 40,
            XOR = 41,
            AND_OP = 42,
            LEFT_SHIFT = 43,
            RIGHT_SHIFT = 44,
            ADD = 45,
            MINUS = 46,
            DIV = 47,
            MOD = 48,
            IDIV = 49,
            NOT_OP = 50,
            OPEN_BRACE = 51,
            CLOSE_BRACE = 52,
            LESS_THAN = 53,
            GREATER_THAN = 54,
            EQUALS = 55,
            GT_EQ = 56,
            LT_EQ = 57,
            NOT_EQ_1 = 58,
            NOT_EQ_2 = 59,
            AT = 60,
            ARROW = 61,
            ADD_ASSIGN = 62,
            SUB_ASSIGN = 63,
            MULT_ASSIGN = 64,
            AT_ASSIGN = 65,
            DIV_ASSIGN = 66,
            MOD_ASSIGN = 67,
            AND_ASSIGN = 68,
            OR_ASSIGN = 69,
            XOR_ASSIGN = 70,
            LEFT_SHIFT_ASSIGN = 71,
            RIGHT_SHIFT_ASSIGN = 72,
            POWER_ASSIGN = 73,
            IDIV_ASSIGN = 74,
            SKIP_ = 75,
            UNKNOWN_CHAR = 76;
    public static final int RULE_root = 0,
            RULE_simple_stmts = 1,
            RULE_compound_stmt = 2,
            RULE_simple_stmt = 3,
            RULE_assignment = 4,
            RULE_return_stmt = 5,
            RULE_import_stm = 6,
            RULE_dotted_name = 7,
            RULE_funcdef = 8,
            RULE_paramlist = 9,
            RULE_paramdef = 10,
            RULE_augassign = 11,
            RULE_if_stmt = 12,
            RULE_while_stmt = 13,
            RULE_for_stmt = 14,
            RULE_block = 15,
            RULE_comp_op = 16,
            RULE_expr = 17,
            RULE_atom = 18,
            RULE_testlist_comp = 19,
            RULE_trailer = 20,
            RULE_exprlist = 21,
            RULE_arglist = 22,
            RULE_argument = 23,
            RULE_comp_iter = 24,
            RULE_comp_for = 25,
            RULE_comp_if = 26;

    private static String[] makeRuleNames() {
        return new String[] {
                "root",
                "simple_stmts",
                "compound_stmt",
                "simple_stmt",
                "assignment",
                "return_stmt",
                "import_stm",
                "dotted_name",
                "funcdef",
                "paramlist",
                "paramdef",
                "augassign",
                "if_stmt",
                "while_stmt",
                "for_stmt",
                "block",
                "comp_op",
                "expr",
                "atom",
                "testlist_comp",
                "trailer",
                "exprlist",
                "arglist",
                "argument",
                "comp_iter",
                "comp_for",
                "comp_if"
        };
    }

    public static final String[] ruleNames = makeRuleNames();

    private static String[] makeLiteralNames() {
        return new String[] {
                null,
                null,
                null,
                null,
                null,
                "'and'",
                "'as'",
                "'def'",
                "'elif'",
                "'else'",
                "'False'",
                "'for'",
                "'from'",
                "'if'",
                "'import'",
                "'in'",
                "'is'",
                "'None'",
                "'not'",
                "'or'",
                "'return'",
                "'True'",
                "'_'",
                "'while'",
                null,
                null,
                null,
                null,
                "'.'",
                "'...'",
                "'*'",
                "'('",
                "')'",
                "','",
                "':'",
                "';'",
                "'**'",
                "'='",
                "'['",
                "']'",
                "'|'",
                "'^'",
                "'&'",
                "'<<'",
                "'>>'",
                "'+'",
                "'-'",
                "'/'",
                "'%'",
                "'//'",
                "'~'",
                "'{'",
                "'}'",
                "'<'",
                "'>'",
                "'=='",
                "'>='",
                "'<='",
                "'<>'",
                "'!='",
                "'@'",
                "'->'",
                "'+='",
                "'-='",
                "'*='",
                "'@='",
                "'/='",
                "'%='",
                "'&='",
                "'|='",
                "'^='",
                "'<<='",
                "'>>='",
                "'**='",
                "'//='"
        };
    }

    private static final String[] _LITERAL_NAMES = makeLiteralNames();

    private static String[] makeSymbolicNames() {
        return new String[] {
                null,
                "INDENT",
                "DEDENT",
                "STRING",
                "NUMBER",
                "AND",
                "AS",
                "DEF",
                "ELIF",
                "ELSE",
                "FALSE",
                "FOR",
                "FROM",
                "IF",
                "IMPORT",
                "IN",
                "IS",
                "NONE",
                "NOT",
                "OR",
                "RETURN",
                "TRUE",
                "UNDERSCORE",
                "WHILE",
                "NEWLINE",
                "NAME",
                "DECIMAL_INTEGER",
                "FLOAT_NUMBER",
                "DOT",
                "ELLIPSIS",
                "STAR",
                "OPEN_PAREN",
                "CLOSE_PAREN",
                "COMMA",
                "COLON",
                "SEMI_COLON",
                "POWER",
                "ASSIGN",
                "OPEN_BRACK",
                "CLOSE_BRACK",
                "OR_OP",
                "XOR",
                "AND_OP",
                "LEFT_SHIFT",
                "RIGHT_SHIFT",
                "ADD",
                "MINUS",
                "DIV",
                "MOD",
                "IDIV",
                "NOT_OP",
                "OPEN_BRACE",
                "CLOSE_BRACE",
                "LESS_THAN",
                "GREATER_THAN",
                "EQUALS",
                "GT_EQ",
                "LT_EQ",
                "NOT_EQ_1",
                "NOT_EQ_2",
                "AT",
                "ARROW",
                "ADD_ASSIGN",
                "SUB_ASSIGN",
                "MULT_ASSIGN",
                "AT_ASSIGN",
                "DIV_ASSIGN",
                "MOD_ASSIGN",
                "AND_ASSIGN",
                "OR_ASSIGN",
                "XOR_ASSIGN",
                "LEFT_SHIFT_ASSIGN",
                "RIGHT_SHIFT_ASSIGN",
                "POWER_ASSIGN",
                "IDIV_ASSIGN",
                "SKIP_",
                "UNKNOWN_CHAR"
        };
    }

    private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
    public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);

    /**
     * @deprecated Use {@link #VOCABULARY} instead.
     */
    @Deprecated
    public static final String[] tokenNames;

    static {
        tokenNames = new String[_SYMBOLIC_NAMES.length];
        for (int i = 0; i < tokenNames.length; i++) {
            tokenNames[i] = VOCABULARY.getLiteralName(i);
            if (tokenNames[i] == null) {
                tokenNames[i] = VOCABULARY.getSymbolicName(i);
            }

            if (tokenNames[i] == null) {
                tokenNames[i] = "<INVALID>";
            }
        }
    }

    @Override
    @Deprecated
    public String[] getTokenNames() {
        return tokenNames;
    }

    @Override
    public Vocabulary getVocabulary() {
        return VOCABULARY;
    }

    @Override
    public String getGrammarFileName() {
        return "Python3Parser.g4";
    }

    @Override
    public String[] getRuleNames() {
        return ruleNames;
    }

    @Override
    public String getSerializedATN() {
        return _serializedATN;
    }

    @Override
    public ATN getATN() {
        return _ATN;
    }

    public Python3Parser(TokenStream input) {
        super(input);
        _interp = new ParserATNSimulator(this, _ATN, _decisionToDFA, _sharedContextCache);
    }

    @SuppressWarnings("CheckReturnValue")
    public static class RootContext extends ParserRuleContext {
        public TerminalNode EOF() {
            return getToken(Python3Parser.EOF, 0);
        }

        public List<TerminalNode> NEWLINE() {
            return getTokens(Python3Parser.NEWLINE);
        }

        public TerminalNode NEWLINE(int i) {
            return getToken(Python3Parser.NEWLINE, i);
        }

        public List<Simple_stmtsContext> simple_stmts() {
            return getRuleContexts(Simple_stmtsContext.class);
        }

        public Simple_stmtsContext simple_stmts(int i) {
            return getRuleContext(Simple_stmtsContext.class, i);
        }

        public List<Compound_stmtContext> compound_stmt() {
            return getRuleContexts(Compound_stmtContext.class);
        }

        public Compound_stmtContext compound_stmt(int i) {
            return getRuleContext(Compound_stmtContext.class, i);
        }

        public RootContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_root;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterRoot(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitRoot(this);
        }
    }

    public final RootContext root() throws RecognitionException {
        RootContext _localctx = new RootContext(_ctx, getState());
        enterRule(_localctx, 0, RULE_root);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(57);
                _errHandler.sync(this);
                _la = _input.LA(1);
                while (_la == NEWLINE) {
                    {
                        {
                            setState(54);
                            match(NEWLINE);
                        }
                    }
                    setState(59);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                }
                setState(64);
                _errHandler.sync(this);
                _la = _input.LA(1);
                while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530444569752L) != 0)) {
                    {
                        setState(62);
                        _errHandler.sync(this);
                        switch (_input.LA(1)) {
                            case STRING:
                            case NUMBER:
                            case FALSE:
                            case FROM:
                            case IMPORT:
                            case NONE:
                            case NOT:
                            case RETURN:
                            case TRUE:
                            case NAME:
                            case ELLIPSIS:
                            case OPEN_PAREN:
                            case OPEN_BRACK:
                            case ADD:
                            case MINUS:
                            case NOT_OP:
                            case OPEN_BRACE: {
                                setState(60);
                                simple_stmts();
                            }
                                break;
                            case DEF:
                            case FOR:
                            case IF:
                            case WHILE: {
                                setState(61);
                                compound_stmt();
                            }
                                break;
                            default:
                                throw new NoViableAltException(this);
                        }
                    }
                    setState(66);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                }
                setState(67);
                match(EOF);
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Simple_stmtsContext extends ParserRuleContext {
        public List<Simple_stmtContext> simple_stmt() {
            return getRuleContexts(Simple_stmtContext.class);
        }

        public Simple_stmtContext simple_stmt(int i) {
            return getRuleContext(Simple_stmtContext.class, i);
        }

        public TerminalNode NEWLINE() {
            return getToken(Python3Parser.NEWLINE, 0);
        }

        public List<TerminalNode> SEMI_COLON() {
            return getTokens(Python3Parser.SEMI_COLON);
        }

        public TerminalNode SEMI_COLON(int i) {
            return getToken(Python3Parser.SEMI_COLON, i);
        }

        public Simple_stmtsContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_simple_stmts;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterSimple_stmts(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitSimple_stmts(this);
        }
    }

    public final Simple_stmtsContext simple_stmts() throws RecognitionException {
        Simple_stmtsContext _localctx = new Simple_stmtsContext(_ctx, getState());
        enterRule(_localctx, 2, RULE_simple_stmts);
        int _la;
        try {
            int _alt;
            enterOuterAlt(_localctx, 1);
            {
                setState(69);
                simple_stmt();
                setState(74);
                _errHandler.sync(this);
                _alt = getInterpreter().adaptivePredict(_input, 3, _ctx);
                while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) {
                    if (_alt == 1) {
                        {
                            {
                                setState(70);
                                match(SEMI_COLON);
                                setState(71);
                                simple_stmt();
                            }
                        }
                    }
                    setState(76);
                    _errHandler.sync(this);
                    _alt = getInterpreter().adaptivePredict(_input, 3, _ctx);
                }
                setState(78);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == SEMI_COLON) {
                    {
                        setState(77);
                        match(SEMI_COLON);
                    }
                }

                setState(80);
                match(NEWLINE);
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Compound_stmtContext extends ParserRuleContext {
        public If_stmtContext if_stmt() {
            return getRuleContext(If_stmtContext.class, 0);
        }

        public While_stmtContext while_stmt() {
            return getRuleContext(While_stmtContext.class, 0);
        }

        public For_stmtContext for_stmt() {
            return getRuleContext(For_stmtContext.class, 0);
        }

        public FuncdefContext funcdef() {
            return getRuleContext(FuncdefContext.class, 0);
        }

        public Compound_stmtContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_compound_stmt;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterCompound_stmt(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitCompound_stmt(this);
        }
    }

    public final Compound_stmtContext compound_stmt() throws RecognitionException {
        Compound_stmtContext _localctx = new Compound_stmtContext(_ctx, getState());
        enterRule(_localctx, 4, RULE_compound_stmt);
        try {
            setState(86);
            _errHandler.sync(this);
            switch (_input.LA(1)) {
                case IF:
                    enterOuterAlt(_localctx, 1); {
                    setState(82);
                    if_stmt();
                }
                    break;
                case WHILE:
                    enterOuterAlt(_localctx, 2); {
                    setState(83);
                    while_stmt();
                }
                    break;
                case FOR:
                    enterOuterAlt(_localctx, 3); {
                    setState(84);
                    for_stmt();
                }
                    break;
                case DEF:
                    enterOuterAlt(_localctx, 4); {
                    setState(85);
                    funcdef();
                }
                    break;
                default:
                    throw new NoViableAltException(this);
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Simple_stmtContext extends ParserRuleContext {
        public AssignmentContext assignment() {
            return getRuleContext(AssignmentContext.class, 0);
        }

        public ExprContext expr() {
            return getRuleContext(ExprContext.class, 0);
        }

        public Return_stmtContext return_stmt() {
            return getRuleContext(Return_stmtContext.class, 0);
        }

        public Import_stmContext import_stm() {
            return getRuleContext(Import_stmContext.class, 0);
        }

        public Simple_stmtContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_simple_stmt;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterSimple_stmt(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitSimple_stmt(this);
        }
    }

    public final Simple_stmtContext simple_stmt() throws RecognitionException {
        Simple_stmtContext _localctx = new Simple_stmtContext(_ctx, getState());
        enterRule(_localctx, 6, RULE_simple_stmt);
        try {
            setState(92);
            _errHandler.sync(this);
            switch (getInterpreter().adaptivePredict(_input, 6, _ctx)) {
                case 1:
                    enterOuterAlt(_localctx, 1); {
                    setState(88);
                    assignment();
                }
                    break;
                case 2:
                    enterOuterAlt(_localctx, 2); {
                    setState(89);
                    expr(0);
                }
                    break;
                case 3:
                    enterOuterAlt(_localctx, 3); {
                    setState(90);
                    return_stmt();
                }
                    break;
                case 4:
                    enterOuterAlt(_localctx, 4); {
                    setState(91);
                    import_stm();
                }
                    break;
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class AssignmentContext extends ParserRuleContext {
        public List<ExprlistContext> exprlist() {
            return getRuleContexts(ExprlistContext.class);
        }

        public ExprlistContext exprlist(int i) {
            return getRuleContext(ExprlistContext.class, i);
        }

        public AugassignContext augassign() {
            return getRuleContext(AugassignContext.class, 0);
        }

        public AssignmentContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_assignment;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterAssignment(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitAssignment(this);
        }
    }

    public final AssignmentContext assignment() throws RecognitionException {
        AssignmentContext _localctx = new AssignmentContext(_ctx, getState());
        enterRule(_localctx, 8, RULE_assignment);
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(94);
                exprlist();
                setState(95);
                augassign();
                setState(96);
                exprlist();
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Return_stmtContext extends ParserRuleContext {
        public TerminalNode RETURN() {
            return getToken(Python3Parser.RETURN, 0);
        }

        public ExprlistContext exprlist() {
            return getRuleContext(ExprlistContext.class, 0);
        }

        public Return_stmtContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_return_stmt;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterReturn_stmt(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitReturn_stmt(this);
        }
    }

    public final Return_stmtContext return_stmt() throws RecognitionException {
        Return_stmtContext _localctx = new Return_stmtContext(_ctx, getState());
        enterRule(_localctx, 10, RULE_return_stmt);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(98);
                match(RETURN);
                setState(100);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                    {
                        setState(99);
                        exprlist();
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Import_stmContext extends ParserRuleContext {
        public TerminalNode IMPORT() {
            return getToken(Python3Parser.IMPORT, 0);
        }

        public Dotted_nameContext dotted_name() {
            return getRuleContext(Dotted_nameContext.class, 0);
        }

        public TerminalNode AS() {
            return getToken(Python3Parser.AS, 0);
        }

        public List<TerminalNode> NAME() {
            return getTokens(Python3Parser.NAME);
        }

        public TerminalNode NAME(int i) {
            return getToken(Python3Parser.NAME, i);
        }

        public TerminalNode FROM() {
            return getToken(Python3Parser.FROM, 0);
        }

        public TerminalNode STAR() {
            return getToken(Python3Parser.STAR, 0);
        }

        public List<TerminalNode> COMMA() {
            return getTokens(Python3Parser.COMMA);
        }

        public TerminalNode COMMA(int i) {
            return getToken(Python3Parser.COMMA, i);
        }

        public Import_stmContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_import_stm;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterImport_stm(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitImport_stm(this);
        }
    }

    public final Import_stmContext import_stm() throws RecognitionException {
        Import_stmContext _localctx = new Import_stmContext(_ctx, getState());
        enterRule(_localctx, 12, RULE_import_stm);
        int _la;
        try {
            setState(122);
            _errHandler.sync(this);
            switch (_input.LA(1)) {
                case IMPORT:
                    enterOuterAlt(_localctx, 1); {
                    setState(102);
                    match(IMPORT);
                    setState(103);
                    dotted_name();
                    setState(106);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if (_la == AS) {
                        {
                            setState(104);
                            match(AS);
                            setState(105);
                            match(NAME);
                        }
                    }
                }
                    break;
                case FROM:
                    enterOuterAlt(_localctx, 2); {
                    setState(108);
                    match(FROM);
                    setState(109);
                    dotted_name();
                    setState(110);
                    match(IMPORT);
                    setState(120);
                    _errHandler.sync(this);
                    switch (_input.LA(1)) {
                        case NAME: {
                            setState(111);
                            match(NAME);
                            setState(116);
                            _errHandler.sync(this);
                            _la = _input.LA(1);
                            while (_la == COMMA) {
                                {
                                    {
                                        setState(112);
                                        match(COMMA);
                                        setState(113);
                                        match(NAME);
                                    }
                                }
                                setState(118);
                                _errHandler.sync(this);
                                _la = _input.LA(1);
                            }
                        }
                            break;
                        case STAR: {
                            setState(119);
                            match(STAR);
                        }
                            break;
                        default:
                            throw new NoViableAltException(this);
                    }
                }
                    break;
                default:
                    throw new NoViableAltException(this);
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Dotted_nameContext extends ParserRuleContext {
        public List<TerminalNode> NAME() {
            return getTokens(Python3Parser.NAME);
        }

        public TerminalNode NAME(int i) {
            return getToken(Python3Parser.NAME, i);
        }

        public List<TerminalNode> DOT() {
            return getTokens(Python3Parser.DOT);
        }

        public TerminalNode DOT(int i) {
            return getToken(Python3Parser.DOT, i);
        }

        public Dotted_nameContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_dotted_name;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterDotted_name(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitDotted_name(this);
        }
    }

    public final Dotted_nameContext dotted_name() throws RecognitionException {
        Dotted_nameContext _localctx = new Dotted_nameContext(_ctx, getState());
        enterRule(_localctx, 14, RULE_dotted_name);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(124);
                match(NAME);
                setState(129);
                _errHandler.sync(this);
                _la = _input.LA(1);
                while (_la == DOT) {
                    {
                        {
                            setState(125);
                            match(DOT);
                            setState(126);
                            match(NAME);
                        }
                    }
                    setState(131);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class FuncdefContext extends ParserRuleContext {
        public TerminalNode DEF() {
            return getToken(Python3Parser.DEF, 0);
        }

        public TerminalNode NAME() {
            return getToken(Python3Parser.NAME, 0);
        }

        public TerminalNode OPEN_PAREN() {
            return getToken(Python3Parser.OPEN_PAREN, 0);
        }

        public TerminalNode CLOSE_PAREN() {
            return getToken(Python3Parser.CLOSE_PAREN, 0);
        }

        public TerminalNode COLON() {
            return getToken(Python3Parser.COLON, 0);
        }

        public BlockContext block() {
            return getRuleContext(BlockContext.class, 0);
        }

        public ParamlistContext paramlist() {
            return getRuleContext(ParamlistContext.class, 0);
        }

        public FuncdefContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_funcdef;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterFuncdef(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitFuncdef(this);
        }
    }

    public final FuncdefContext funcdef() throws RecognitionException {
        FuncdefContext _localctx = new FuncdefContext(_ctx, getState());
        enterRule(_localctx, 16, RULE_funcdef);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(132);
                match(DEF);
                setState(133);
                match(NAME);
                setState(134);
                match(OPEN_PAREN);
                setState(136);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == NAME) {
                    {
                        setState(135);
                        paramlist();
                    }
                }

                setState(138);
                match(CLOSE_PAREN);
                setState(139);
                match(COLON);
                setState(140);
                block();
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class ParamlistContext extends ParserRuleContext {
        public List<ParamdefContext> paramdef() {
            return getRuleContexts(ParamdefContext.class);
        }

        public ParamdefContext paramdef(int i) {
            return getRuleContext(ParamdefContext.class, i);
        }

        public List<TerminalNode> ASSIGN() {
            return getTokens(Python3Parser.ASSIGN);
        }

        public TerminalNode ASSIGN(int i) {
            return getToken(Python3Parser.ASSIGN, i);
        }

        public List<ExprContext> expr() {
            return getRuleContexts(ExprContext.class);
        }

        public ExprContext expr(int i) {
            return getRuleContext(ExprContext.class, i);
        }

        public List<TerminalNode> COMMA() {
            return getTokens(Python3Parser.COMMA);
        }

        public TerminalNode COMMA(int i) {
            return getToken(Python3Parser.COMMA, i);
        }

        public ParamlistContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_paramlist;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterParamlist(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitParamlist(this);
        }
    }

    public final ParamlistContext paramlist() throws RecognitionException {
        ParamlistContext _localctx = new ParamlistContext(_ctx, getState());
        enterRule(_localctx, 18, RULE_paramlist);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(142);
                paramdef();
                setState(145);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == ASSIGN) {
                    {
                        setState(143);
                        match(ASSIGN);
                        setState(144);
                        expr(0);
                    }
                }

                setState(155);
                _errHandler.sync(this);
                _la = _input.LA(1);
                while (_la == COMMA) {
                    {
                        {
                            setState(147);
                            match(COMMA);
                            setState(148);
                            paramdef();
                            setState(151);
                            _errHandler.sync(this);
                            _la = _input.LA(1);
                            if (_la == ASSIGN) {
                                {
                                    setState(149);
                                    match(ASSIGN);
                                    setState(150);
                                    expr(0);
                                }
                            }
                        }
                    }
                    setState(157);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class ParamdefContext extends ParserRuleContext {
        public TerminalNode NAME() {
            return getToken(Python3Parser.NAME, 0);
        }

        public TerminalNode COLON() {
            return getToken(Python3Parser.COLON, 0);
        }

        public ExprContext expr() {
            return getRuleContext(ExprContext.class, 0);
        }

        public ParamdefContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_paramdef;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterParamdef(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitParamdef(this);
        }
    }

    public final ParamdefContext paramdef() throws RecognitionException {
        ParamdefContext _localctx = new ParamdefContext(_ctx, getState());
        enterRule(_localctx, 20, RULE_paramdef);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(158);
                match(NAME);
                setState(161);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == COLON) {
                    {
                        setState(159);
                        match(COLON);
                        setState(160);
                        expr(0);
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class AugassignContext extends ParserRuleContext {
        public TerminalNode ASSIGN() {
            return getToken(Python3Parser.ASSIGN, 0);
        }

        public TerminalNode ADD_ASSIGN() {
            return getToken(Python3Parser.ADD_ASSIGN, 0);
        }

        public TerminalNode SUB_ASSIGN() {
            return getToken(Python3Parser.SUB_ASSIGN, 0);
        }

        public TerminalNode MULT_ASSIGN() {
            return getToken(Python3Parser.MULT_ASSIGN, 0);
        }

        public TerminalNode AT_ASSIGN() {
            return getToken(Python3Parser.AT_ASSIGN, 0);
        }

        public TerminalNode DIV_ASSIGN() {
            return getToken(Python3Parser.DIV_ASSIGN, 0);
        }

        public TerminalNode MOD_ASSIGN() {
            return getToken(Python3Parser.MOD_ASSIGN, 0);
        }

        public TerminalNode AND_ASSIGN() {
            return getToken(Python3Parser.AND_ASSIGN, 0);
        }

        public TerminalNode OR_ASSIGN() {
            return getToken(Python3Parser.OR_ASSIGN, 0);
        }

        public TerminalNode XOR_ASSIGN() {
            return getToken(Python3Parser.XOR_ASSIGN, 0);
        }

        public TerminalNode LEFT_SHIFT_ASSIGN() {
            return getToken(Python3Parser.LEFT_SHIFT_ASSIGN, 0);
        }

        public TerminalNode RIGHT_SHIFT_ASSIGN() {
            return getToken(Python3Parser.RIGHT_SHIFT_ASSIGN, 0);
        }

        public TerminalNode POWER_ASSIGN() {
            return getToken(Python3Parser.POWER_ASSIGN, 0);
        }

        public TerminalNode IDIV_ASSIGN() {
            return getToken(Python3Parser.IDIV_ASSIGN, 0);
        }

        public AugassignContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_augassign;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterAugassign(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitAugassign(this);
        }
    }

    public final AugassignContext augassign() throws RecognitionException {
        AugassignContext _localctx = new AugassignContext(_ctx, getState());
        enterRule(_localctx, 22, RULE_augassign);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(163);
                _la = _input.LA(1);
                if (!(((((_la - 37)) & ~0x3f) == 0 && ((1L << (_la - 37)) & 274844352513L) != 0))) {
                    _errHandler.recoverInline(this);
                } else {
                    if (_input.LA(1) == Token.EOF)
                        matchedEOF = true;
                    _errHandler.reportMatch(this);
                    consume();
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class If_stmtContext extends ParserRuleContext {
        public TerminalNode IF() {
            return getToken(Python3Parser.IF, 0);
        }

        public List<ExprContext> expr() {
            return getRuleContexts(ExprContext.class);
        }

        public ExprContext expr(int i) {
            return getRuleContext(ExprContext.class, i);
        }

        public List<TerminalNode> COLON() {
            return getTokens(Python3Parser.COLON);
        }

        public TerminalNode COLON(int i) {
            return getToken(Python3Parser.COLON, i);
        }

        public List<BlockContext> block() {
            return getRuleContexts(BlockContext.class);
        }

        public BlockContext block(int i) {
            return getRuleContext(BlockContext.class, i);
        }

        public List<TerminalNode> ELIF() {
            return getTokens(Python3Parser.ELIF);
        }

        public TerminalNode ELIF(int i) {
            return getToken(Python3Parser.ELIF, i);
        }

        public TerminalNode ELSE() {
            return getToken(Python3Parser.ELSE, 0);
        }

        public If_stmtContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_if_stmt;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterIf_stmt(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitIf_stmt(this);
        }
    }

    public final If_stmtContext if_stmt() throws RecognitionException {
        If_stmtContext _localctx = new If_stmtContext(_ctx, getState());
        enterRule(_localctx, 24, RULE_if_stmt);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(165);
                match(IF);
                setState(166);
                expr(0);
                setState(167);
                match(COLON);
                setState(168);
                block();
                setState(176);
                _errHandler.sync(this);
                _la = _input.LA(1);
                while (_la == ELIF) {
                    {
                        {
                            setState(169);
                            match(ELIF);
                            setState(170);
                            expr(0);
                            setState(171);
                            match(COLON);
                            setState(172);
                            block();
                        }
                    }
                    setState(178);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                }
                setState(182);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == ELSE) {
                    {
                        setState(179);
                        match(ELSE);
                        setState(180);
                        match(COLON);
                        setState(181);
                        block();
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class While_stmtContext extends ParserRuleContext {
        public TerminalNode WHILE() {
            return getToken(Python3Parser.WHILE, 0);
        }

        public ExprContext expr() {
            return getRuleContext(ExprContext.class, 0);
        }

        public List<TerminalNode> COLON() {
            return getTokens(Python3Parser.COLON);
        }

        public TerminalNode COLON(int i) {
            return getToken(Python3Parser.COLON, i);
        }

        public List<BlockContext> block() {
            return getRuleContexts(BlockContext.class);
        }

        public BlockContext block(int i) {
            return getRuleContext(BlockContext.class, i);
        }

        public TerminalNode ELSE() {
            return getToken(Python3Parser.ELSE, 0);
        }

        public While_stmtContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_while_stmt;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterWhile_stmt(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitWhile_stmt(this);
        }
    }

    public final While_stmtContext while_stmt() throws RecognitionException {
        While_stmtContext _localctx = new While_stmtContext(_ctx, getState());
        enterRule(_localctx, 26, RULE_while_stmt);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(184);
                match(WHILE);
                setState(185);
                expr(0);
                setState(186);
                match(COLON);
                setState(187);
                block();
                setState(191);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == ELSE) {
                    {
                        setState(188);
                        match(ELSE);
                        setState(189);
                        match(COLON);
                        setState(190);
                        block();
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class For_stmtContext extends ParserRuleContext {
        public TerminalNode FOR() {
            return getToken(Python3Parser.FOR, 0);
        }

        public ExprlistContext exprlist() {
            return getRuleContext(ExprlistContext.class, 0);
        }

        public List<TerminalNode> COLON() {
            return getTokens(Python3Parser.COLON);
        }

        public TerminalNode COLON(int i) {
            return getToken(Python3Parser.COLON, i);
        }

        public List<BlockContext> block() {
            return getRuleContexts(BlockContext.class);
        }

        public BlockContext block(int i) {
            return getRuleContext(BlockContext.class, i);
        }

        public TerminalNode ELSE() {
            return getToken(Python3Parser.ELSE, 0);
        }

        public For_stmtContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_for_stmt;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterFor_stmt(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitFor_stmt(this);
        }
    }

    public final For_stmtContext for_stmt() throws RecognitionException {
        For_stmtContext _localctx = new For_stmtContext(_ctx, getState());
        enterRule(_localctx, 28, RULE_for_stmt);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(193);
                match(FOR);
                setState(194);
                exprlist();
                setState(195);
                match(COLON);
                setState(196);
                block();
                setState(200);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == ELSE) {
                    {
                        setState(197);
                        match(ELSE);
                        setState(198);
                        match(COLON);
                        setState(199);
                        block();
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class BlockContext extends ParserRuleContext {
        public List<Simple_stmtsContext> simple_stmts() {
            return getRuleContexts(Simple_stmtsContext.class);
        }

        public Simple_stmtsContext simple_stmts(int i) {
            return getRuleContext(Simple_stmtsContext.class, i);
        }

        public TerminalNode NEWLINE() {
            return getToken(Python3Parser.NEWLINE, 0);
        }

        public TerminalNode INDENT() {
            return getToken(Python3Parser.INDENT, 0);
        }

        public TerminalNode DEDENT() {
            return getToken(Python3Parser.DEDENT, 0);
        }

        public List<Compound_stmtContext> compound_stmt() {
            return getRuleContexts(Compound_stmtContext.class);
        }

        public Compound_stmtContext compound_stmt(int i) {
            return getRuleContext(Compound_stmtContext.class, i);
        }

        public BlockContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_block;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterBlock(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitBlock(this);
        }
    }

    public final BlockContext block() throws RecognitionException {
        BlockContext _localctx = new BlockContext(_ctx, getState());
        enterRule(_localctx, 30, RULE_block);
        int _la;
        try {
            setState(213);
            _errHandler.sync(this);
            switch (_input.LA(1)) {
                case STRING:
                case NUMBER:
                case FALSE:
                case FROM:
                case IMPORT:
                case NONE:
                case NOT:
                case RETURN:
                case TRUE:
                case NAME:
                case ELLIPSIS:
                case OPEN_PAREN:
                case OPEN_BRACK:
                case ADD:
                case MINUS:
                case NOT_OP:
                case OPEN_BRACE:
                    enterOuterAlt(_localctx, 1); {
                    setState(202);
                    simple_stmts();
                }
                    break;
                case NEWLINE:
                    enterOuterAlt(_localctx, 2); {
                    setState(203);
                    match(NEWLINE);
                    setState(204);
                    match(INDENT);
                    setState(207);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    do {
                        {
                            setState(207);
                            _errHandler.sync(this);
                            switch (_input.LA(1)) {
                                case STRING:
                                case NUMBER:
                                case FALSE:
                                case FROM:
                                case IMPORT:
                                case NONE:
                                case NOT:
                                case RETURN:
                                case TRUE:
                                case NAME:
                                case ELLIPSIS:
                                case OPEN_PAREN:
                                case OPEN_BRACK:
                                case ADD:
                                case MINUS:
                                case NOT_OP:
                                case OPEN_BRACE: {
                                    setState(205);
                                    simple_stmts();
                                }
                                    break;
                                case DEF:
                                case FOR:
                                case IF:
                                case WHILE: {
                                    setState(206);
                                    compound_stmt();
                                }
                                    break;
                                default:
                                    throw new NoViableAltException(this);
                            }
                        }
                        setState(209);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                    } while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530444569752L) != 0));
                    setState(211);
                    match(DEDENT);
                }
                    break;
                default:
                    throw new NoViableAltException(this);
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Comp_opContext extends ParserRuleContext {
        public TerminalNode LESS_THAN() {
            return getToken(Python3Parser.LESS_THAN, 0);
        }

        public TerminalNode GREATER_THAN() {
            return getToken(Python3Parser.GREATER_THAN, 0);
        }

        public TerminalNode EQUALS() {
            return getToken(Python3Parser.EQUALS, 0);
        }

        public TerminalNode GT_EQ() {
            return getToken(Python3Parser.GT_EQ, 0);
        }

        public TerminalNode LT_EQ() {
            return getToken(Python3Parser.LT_EQ, 0);
        }

        public TerminalNode NOT_EQ_1() {
            return getToken(Python3Parser.NOT_EQ_1, 0);
        }

        public TerminalNode NOT_EQ_2() {
            return getToken(Python3Parser.NOT_EQ_2, 0);
        }

        public TerminalNode IN() {
            return getToken(Python3Parser.IN, 0);
        }

        public TerminalNode NOT() {
            return getToken(Python3Parser.NOT, 0);
        }

        public TerminalNode IS() {
            return getToken(Python3Parser.IS, 0);
        }

        public Comp_opContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_comp_op;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterComp_op(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitComp_op(this);
        }
    }

    public final Comp_opContext comp_op() throws RecognitionException {
        Comp_opContext _localctx = new Comp_opContext(_ctx, getState());
        enterRule(_localctx, 32, RULE_comp_op);
        try {
            setState(228);
            _errHandler.sync(this);
            switch (getInterpreter().adaptivePredict(_input, 25, _ctx)) {
                case 1:
                    enterOuterAlt(_localctx, 1); {
                    setState(215);
                    match(LESS_THAN);
                }
                    break;
                case 2:
                    enterOuterAlt(_localctx, 2); {
                    setState(216);
                    match(GREATER_THAN);
                }
                    break;
                case 3:
                    enterOuterAlt(_localctx, 3); {
                    setState(217);
                    match(EQUALS);
                }
                    break;
                case 4:
                    enterOuterAlt(_localctx, 4); {
                    setState(218);
                    match(GT_EQ);
                }
                    break;
                case 5:
                    enterOuterAlt(_localctx, 5); {
                    setState(219);
                    match(LT_EQ);
                }
                    break;
                case 6:
                    enterOuterAlt(_localctx, 6); {
                    setState(220);
                    match(NOT_EQ_1);
                }
                    break;
                case 7:
                    enterOuterAlt(_localctx, 7); {
                    setState(221);
                    match(NOT_EQ_2);
                }
                    break;
                case 8:
                    enterOuterAlt(_localctx, 8); {
                    setState(222);
                    match(IN);
                }
                    break;
                case 9:
                    enterOuterAlt(_localctx, 9); {
                    setState(223);
                    match(NOT);
                    setState(224);
                    match(IN);
                }
                    break;
                case 10:
                    enterOuterAlt(_localctx, 10); {
                    setState(225);
                    match(IS);
                }
                    break;
                case 11:
                    enterOuterAlt(_localctx, 11); {
                    setState(226);
                    match(IS);
                    setState(227);
                    match(NOT);
                }
                    break;
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class ExprContext extends ParserRuleContext {
        public AtomContext atom() {
            return getRuleContext(AtomContext.class, 0);
        }

        public List<TrailerContext> trailer() {
            return getRuleContexts(TrailerContext.class);
        }

        public TrailerContext trailer(int i) {
            return getRuleContext(TrailerContext.class, i);
        }

        public List<ExprContext> expr() {
            return getRuleContexts(ExprContext.class);
        }

        public ExprContext expr(int i) {
            return getRuleContext(ExprContext.class, i);
        }

        public List<TerminalNode> ADD() {
            return getTokens(Python3Parser.ADD);
        }

        public TerminalNode ADD(int i) {
            return getToken(Python3Parser.ADD, i);
        }

        public List<TerminalNode> MINUS() {
            return getTokens(Python3Parser.MINUS);
        }

        public TerminalNode MINUS(int i) {
            return getToken(Python3Parser.MINUS, i);
        }

        public List<TerminalNode> NOT_OP() {
            return getTokens(Python3Parser.NOT_OP);
        }

        public TerminalNode NOT_OP(int i) {
            return getToken(Python3Parser.NOT_OP, i);
        }

        public TerminalNode NOT() {
            return getToken(Python3Parser.NOT, 0);
        }

        public TerminalNode POWER() {
            return getToken(Python3Parser.POWER, 0);
        }

        public TerminalNode STAR() {
            return getToken(Python3Parser.STAR, 0);
        }

        public TerminalNode AT() {
            return getToken(Python3Parser.AT, 0);
        }

        public TerminalNode DIV() {
            return getToken(Python3Parser.DIV, 0);
        }

        public TerminalNode MOD() {
            return getToken(Python3Parser.MOD, 0);
        }

        public TerminalNode IDIV() {
            return getToken(Python3Parser.IDIV, 0);
        }

        public TerminalNode LEFT_SHIFT() {
            return getToken(Python3Parser.LEFT_SHIFT, 0);
        }

        public TerminalNode RIGHT_SHIFT() {
            return getToken(Python3Parser.RIGHT_SHIFT, 0);
        }

        public TerminalNode AND_OP() {
            return getToken(Python3Parser.AND_OP, 0);
        }

        public TerminalNode XOR() {
            return getToken(Python3Parser.XOR, 0);
        }

        public TerminalNode OR_OP() {
            return getToken(Python3Parser.OR_OP, 0);
        }

        public Comp_opContext comp_op() {
            return getRuleContext(Comp_opContext.class, 0);
        }

        public TerminalNode AND() {
            return getToken(Python3Parser.AND, 0);
        }

        public TerminalNode OR() {
            return getToken(Python3Parser.OR, 0);
        }

        public TerminalNode IF() {
            return getToken(Python3Parser.IF, 0);
        }

        public TerminalNode ELSE() {
            return getToken(Python3Parser.ELSE, 0);
        }

        public ExprContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_expr;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterExpr(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitExpr(this);
        }
    }

    public final ExprContext expr() throws RecognitionException {
        return expr(0);
    }

    private ExprContext expr(int _p) throws RecognitionException {
        ParserRuleContext _parentctx = _ctx;
        int _parentState = getState();
        ExprContext _localctx = new ExprContext(_ctx, _parentState);
        ExprContext _prevctx = _localctx;
        int _startState = 34;
        enterRecursionRule(_localctx, 34, RULE_expr, _p);
        int _la;
        try {
            int _alt;
            enterOuterAlt(_localctx, 1);
            {
                setState(246);
                _errHandler.sync(this);
                switch (_input.LA(1)) {
                    case STRING:
                    case NUMBER:
                    case FALSE:
                    case NONE:
                    case TRUE:
                    case NAME:
                    case ELLIPSIS:
                    case OPEN_PAREN:
                    case OPEN_BRACK:
                    case OPEN_BRACE: {
                        setState(231);
                        atom();
                        setState(235);
                        _errHandler.sync(this);
                        _alt = getInterpreter().adaptivePredict(_input, 26, _ctx);
                        while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) {
                            if (_alt == 1) {
                                {
                                    {
                                        setState(232);
                                        trailer();
                                    }
                                }
                            }
                            setState(237);
                            _errHandler.sync(this);
                            _alt = getInterpreter().adaptivePredict(_input, 26, _ctx);
                        }
                    }
                        break;
                    case ADD:
                    case MINUS:
                    case NOT_OP: {
                        setState(239);
                        _errHandler.sync(this);
                        _alt = 1;
                        do {
                            switch (_alt) {
                                case 1: {
                                    {
                                        setState(238);
                                        _la = _input.LA(1);
                                        if (!((((_la) & ~0x3f) == 0 && ((1L << _la) & 1231453023109120L) != 0))) {
                                            _errHandler.recoverInline(this);
                                        } else {
                                            if (_input.LA(1) == Token.EOF)
                                                matchedEOF = true;
                                            _errHandler.reportMatch(this);
                                            consume();
                                        }
                                    }
                                }
                                    break;
                                default:
                                    throw new NoViableAltException(this);
                            }
                            setState(241);
                            _errHandler.sync(this);
                            _alt = getInterpreter().adaptivePredict(_input, 27, _ctx);
                        } while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER);
                        setState(243);
                        expr(12);
                    }
                        break;
                    case NOT: {
                        setState(244);
                        match(NOT);
                        setState(245);
                        expr(5);
                    }
                        break;
                    default:
                        throw new NoViableAltException(this);
                }
                _ctx.stop = _input.LT(-1);
                setState(287);
                _errHandler.sync(this);
                _alt = getInterpreter().adaptivePredict(_input, 30, _ctx);
                while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) {
                    if (_alt == 1) {
                        if (_parseListeners != null)
                            triggerExitRuleEvent();
                        _prevctx = _localctx;
                        {
                            setState(285);
                            _errHandler.sync(this);
                            switch (getInterpreter().adaptivePredict(_input, 29, _ctx)) {
                                case 1: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(248);
                                    if (!(precpred(_ctx, 13)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 13)");
                                    setState(249);
                                    match(POWER);
                                    setState(250);
                                    expr(14);
                                }
                                    break;
                                case 2: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(251);
                                    if (!(precpred(_ctx, 11)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 11)");
                                    setState(252);
                                    _la = _input.LA(1);
                                    if (!((((_la) & ~0x3f) == 0 && ((1L << _la) & 1153906668099076096L) != 0))) {
                                        _errHandler.recoverInline(this);
                                    } else {
                                        if (_input.LA(1) == Token.EOF)
                                            matchedEOF = true;
                                        _errHandler.reportMatch(this);
                                        consume();
                                    }
                                    setState(253);
                                    expr(12);
                                }
                                    break;
                                case 3: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(254);
                                    if (!(precpred(_ctx, 10)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 10)");
                                    setState(255);
                                    _la = _input.LA(1);
                                    if (!(_la == ADD || _la == MINUS)) {
                                        _errHandler.recoverInline(this);
                                    } else {
                                        if (_input.LA(1) == Token.EOF)
                                            matchedEOF = true;
                                        _errHandler.reportMatch(this);
                                        consume();
                                    }
                                    setState(256);
                                    expr(11);
                                }
                                    break;
                                case 4: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(257);
                                    if (!(precpred(_ctx, 9)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 9)");
                                    setState(258);
                                    _la = _input.LA(1);
                                    if (!(_la == LEFT_SHIFT || _la == RIGHT_SHIFT)) {
                                        _errHandler.recoverInline(this);
                                    } else {
                                        if (_input.LA(1) == Token.EOF)
                                            matchedEOF = true;
                                        _errHandler.reportMatch(this);
                                        consume();
                                    }
                                    setState(259);
                                    expr(10);
                                }
                                    break;
                                case 5: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(260);
                                    if (!(precpred(_ctx, 8)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 8)");
                                    setState(261);
                                    match(AND_OP);
                                    setState(262);
                                    expr(9);
                                }
                                    break;
                                case 6: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(263);
                                    if (!(precpred(_ctx, 7)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 7)");
                                    setState(264);
                                    match(XOR);
                                    setState(265);
                                    expr(8);
                                }
                                    break;
                                case 7: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(266);
                                    if (!(precpred(_ctx, 6)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 6)");
                                    setState(267);
                                    match(OR_OP);
                                    setState(268);
                                    expr(7);
                                }
                                    break;
                                case 8: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(269);
                                    if (!(precpred(_ctx, 4)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 4)");
                                    setState(270);
                                    comp_op();
                                    setState(271);
                                    expr(5);
                                }
                                    break;
                                case 9: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(273);
                                    if (!(precpred(_ctx, 3)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 3)");
                                    setState(274);
                                    match(AND);
                                    setState(275);
                                    expr(4);
                                }
                                    break;
                                case 10: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(276);
                                    if (!(precpred(_ctx, 2)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 2)");
                                    setState(277);
                                    match(OR);
                                    setState(278);
                                    expr(3);
                                }
                                    break;
                                case 11: {
                                    _localctx = new ExprContext(_parentctx, _parentState);
                                    pushNewRecursionContext(_localctx, _startState, RULE_expr);
                                    setState(279);
                                    if (!(precpred(_ctx, 1)))
                                        throw new FailedPredicateException(this, "precpred(_ctx, 1)");
                                    setState(280);
                                    match(IF);
                                    setState(281);
                                    expr(0);
                                    setState(282);
                                    match(ELSE);
                                    setState(283);
                                    expr(2);
                                }
                                    break;
                            }
                        }
                    }
                    setState(289);
                    _errHandler.sync(this);
                    _alt = getInterpreter().adaptivePredict(_input, 30, _ctx);
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            unrollRecursionContexts(_parentctx);
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class AtomContext extends ParserRuleContext {
        public TerminalNode OPEN_PAREN() {
            return getToken(Python3Parser.OPEN_PAREN, 0);
        }

        public TerminalNode CLOSE_PAREN() {
            return getToken(Python3Parser.CLOSE_PAREN, 0);
        }

        public Testlist_compContext testlist_comp() {
            return getRuleContext(Testlist_compContext.class, 0);
        }

        public TerminalNode OPEN_BRACK() {
            return getToken(Python3Parser.OPEN_BRACK, 0);
        }

        public TerminalNode CLOSE_BRACK() {
            return getToken(Python3Parser.CLOSE_BRACK, 0);
        }

        public TerminalNode OPEN_BRACE() {
            return getToken(Python3Parser.OPEN_BRACE, 0);
        }

        public TerminalNode CLOSE_BRACE() {
            return getToken(Python3Parser.CLOSE_BRACE, 0);
        }

        public TerminalNode NAME() {
            return getToken(Python3Parser.NAME, 0);
        }

        public TerminalNode NUMBER() {
            return getToken(Python3Parser.NUMBER, 0);
        }

        public List<TerminalNode> STRING() {
            return getTokens(Python3Parser.STRING);
        }

        public TerminalNode STRING(int i) {
            return getToken(Python3Parser.STRING, i);
        }

        public TerminalNode ELLIPSIS() {
            return getToken(Python3Parser.ELLIPSIS, 0);
        }

        public TerminalNode NONE() {
            return getToken(Python3Parser.NONE, 0);
        }

        public TerminalNode TRUE() {
            return getToken(Python3Parser.TRUE, 0);
        }

        public TerminalNode FALSE() {
            return getToken(Python3Parser.FALSE, 0);
        }

        public AtomContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_atom;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterAtom(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitAtom(this);
        }
    }

    public final AtomContext atom() throws RecognitionException {
        AtomContext _localctx = new AtomContext(_ctx, getState());
        enterRule(_localctx, 36, RULE_atom);
        int _la;
        try {
            int _alt;
            setState(316);
            _errHandler.sync(this);
            switch (_input.LA(1)) {
                case OPEN_PAREN:
                    enterOuterAlt(_localctx, 1); {
                    setState(290);
                    match(OPEN_PAREN);
                    setState(292);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                        {
                            setState(291);
                            testlist_comp();
                        }
                    }

                    setState(294);
                    match(CLOSE_PAREN);
                }
                    break;
                case OPEN_BRACK:
                    enterOuterAlt(_localctx, 2); {
                    setState(295);
                    match(OPEN_BRACK);
                    setState(297);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                        {
                            setState(296);
                            testlist_comp();
                        }
                    }

                    setState(299);
                    match(CLOSE_BRACK);
                }
                    break;
                case OPEN_BRACE:
                    enterOuterAlt(_localctx, 3); {
                    setState(300);
                    match(OPEN_BRACE);
                    setState(302);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                        {
                            setState(301);
                            testlist_comp();
                        }
                    }

                    setState(304);
                    match(CLOSE_BRACE);
                }
                    break;
                case NAME:
                    enterOuterAlt(_localctx, 4); {
                    setState(305);
                    match(NAME);
                }
                    break;
                case NUMBER:
                    enterOuterAlt(_localctx, 5); {
                    setState(306);
                    match(NUMBER);
                }
                    break;
                case STRING:
                    enterOuterAlt(_localctx, 6); {
                    setState(308);
                    _errHandler.sync(this);
                    _alt = 1;
                    do {
                        switch (_alt) {
                            case 1: {
                                {
                                    setState(307);
                                    match(STRING);
                                }
                            }
                                break;
                            default:
                                throw new NoViableAltException(this);
                        }
                        setState(310);
                        _errHandler.sync(this);
                        _alt = getInterpreter().adaptivePredict(_input, 34, _ctx);
                    } while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER);
                }
                    break;
                case ELLIPSIS:
                    enterOuterAlt(_localctx, 7); {
                    setState(312);
                    match(ELLIPSIS);
                }
                    break;
                case NONE:
                    enterOuterAlt(_localctx, 8); {
                    setState(313);
                    match(NONE);
                }
                    break;
                case TRUE:
                    enterOuterAlt(_localctx, 9); {
                    setState(314);
                    match(TRUE);
                }
                    break;
                case FALSE:
                    enterOuterAlt(_localctx, 10); {
                    setState(315);
                    match(FALSE);
                }
                    break;
                default:
                    throw new NoViableAltException(this);
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Testlist_compContext extends ParserRuleContext {
        public List<ExprContext> expr() {
            return getRuleContexts(ExprContext.class);
        }

        public ExprContext expr(int i) {
            return getRuleContext(ExprContext.class, i);
        }

        public Comp_forContext comp_for() {
            return getRuleContext(Comp_forContext.class, 0);
        }

        public List<TerminalNode> COMMA() {
            return getTokens(Python3Parser.COMMA);
        }

        public TerminalNode COMMA(int i) {
            return getToken(Python3Parser.COMMA, i);
        }

        public Testlist_compContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_testlist_comp;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterTestlist_comp(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitTestlist_comp(this);
        }
    }

    public final Testlist_compContext testlist_comp() throws RecognitionException {
        Testlist_compContext _localctx = new Testlist_compContext(_ctx, getState());
        enterRule(_localctx, 38, RULE_testlist_comp);
        int _la;
        try {
            int _alt;
            enterOuterAlt(_localctx, 1);
            {
                setState(318);
                expr(0);
                setState(330);
                _errHandler.sync(this);
                switch (_input.LA(1)) {
                    case FOR: {
                        setState(319);
                        comp_for();
                    }
                        break;
                    case CLOSE_PAREN:
                    case COMMA:
                    case CLOSE_BRACK:
                    case CLOSE_BRACE: {
                        setState(324);
                        _errHandler.sync(this);
                        _alt = getInterpreter().adaptivePredict(_input, 36, _ctx);
                        while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) {
                            if (_alt == 1) {
                                {
                                    {
                                        setState(320);
                                        match(COMMA);
                                        setState(321);
                                        expr(0);
                                    }
                                }
                            }
                            setState(326);
                            _errHandler.sync(this);
                            _alt = getInterpreter().adaptivePredict(_input, 36, _ctx);
                        }
                        setState(328);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
                        if (_la == COMMA) {
                            {
                                setState(327);
                                match(COMMA);
                            }
                        }
                    }
                        break;
                    default:
                        throw new NoViableAltException(this);
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class TrailerContext extends ParserRuleContext {
        public TerminalNode OPEN_PAREN() {
            return getToken(Python3Parser.OPEN_PAREN, 0);
        }

        public TerminalNode CLOSE_PAREN() {
            return getToken(Python3Parser.CLOSE_PAREN, 0);
        }

        public ArglistContext arglist() {
            return getRuleContext(ArglistContext.class, 0);
        }

        public TerminalNode OPEN_BRACK() {
            return getToken(Python3Parser.OPEN_BRACK, 0);
        }

        public List<ExprContext> expr() {
            return getRuleContexts(ExprContext.class);
        }

        public ExprContext expr(int i) {
            return getRuleContext(ExprContext.class, i);
        }

        public TerminalNode CLOSE_BRACK() {
            return getToken(Python3Parser.CLOSE_BRACK, 0);
        }

        public List<TerminalNode> COMMA() {
            return getTokens(Python3Parser.COMMA);
        }

        public TerminalNode COMMA(int i) {
            return getToken(Python3Parser.COMMA, i);
        }

        public TerminalNode DOT() {
            return getToken(Python3Parser.DOT, 0);
        }

        public TerminalNode NAME() {
            return getToken(Python3Parser.NAME, 0);
        }

        public List<TerminalNode> COLON() {
            return getTokens(Python3Parser.COLON);
        }

        public TerminalNode COLON(int i) {
            return getToken(Python3Parser.COLON, i);
        }

        public TrailerContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_trailer;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterTrailer(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitTrailer(this);
        }
    }

    public final TrailerContext trailer() throws RecognitionException {
        TrailerContext _localctx = new TrailerContext(_ctx, getState());
        enterRule(_localctx, 40, RULE_trailer);
        int _la;
        try {
            int _alt;
            setState(368);
            _errHandler.sync(this);
            switch (getInterpreter().adaptivePredict(_input, 46, _ctx)) {
                case 1:
                    enterOuterAlt(_localctx, 1); {
                    setState(332);
                    match(OPEN_PAREN);
                    setState(334);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                        {
                            setState(333);
                            arglist();
                        }
                    }

                    setState(336);
                    match(CLOSE_PAREN);
                }
                    break;
                case 2:
                    enterOuterAlt(_localctx, 2); {
                    setState(337);
                    match(OPEN_BRACK);
                    setState(338);
                    expr(0);
                    setState(343);
                    _errHandler.sync(this);
                    _alt = getInterpreter().adaptivePredict(_input, 40, _ctx);
                    while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) {
                        if (_alt == 1) {
                            {
                                {
                                    setState(339);
                                    match(COMMA);
                                    setState(340);
                                    expr(0);
                                }
                            }
                        }
                        setState(345);
                        _errHandler.sync(this);
                        _alt = getInterpreter().adaptivePredict(_input, 40, _ctx);
                    }
                    setState(347);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if (_la == COMMA) {
                        {
                            setState(346);
                            match(COMMA);
                        }
                    }

                    setState(349);
                    match(CLOSE_BRACK);
                }
                    break;
                case 3:
                    enterOuterAlt(_localctx, 3); {
                    setState(351);
                    match(DOT);
                    setState(352);
                    match(NAME);
                }
                    break;
                case 4:
                    enterOuterAlt(_localctx, 4); {
                    setState(353);
                    match(OPEN_BRACK);
                    setState(355);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                        {
                            setState(354);
                            expr(0);
                        }
                    }

                    setState(357);
                    match(COLON);
                    setState(359);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                        {
                            setState(358);
                            expr(0);
                        }
                    }

                    setState(365);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if (_la == COLON) {
                        {
                            setState(361);
                            match(COLON);
                            setState(363);
                            _errHandler.sync(this);
                            _la = _input.LA(1);
                            if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 3483530435101720L) != 0)) {
                                {
                                    setState(362);
                                    expr(0);
                                }
                            }
                        }
                    }

                    setState(367);
                    match(CLOSE_BRACK);
                }
                    break;
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class ExprlistContext extends ParserRuleContext {
        public List<ExprContext> expr() {
            return getRuleContexts(ExprContext.class);
        }

        public ExprContext expr(int i) {
            return getRuleContext(ExprContext.class, i);
        }

        public List<TerminalNode> COMMA() {
            return getTokens(Python3Parser.COMMA);
        }

        public TerminalNode COMMA(int i) {
            return getToken(Python3Parser.COMMA, i);
        }

        public ExprlistContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_exprlist;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterExprlist(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitExprlist(this);
        }
    }

    public final ExprlistContext exprlist() throws RecognitionException {
        ExprlistContext _localctx = new ExprlistContext(_ctx, getState());
        enterRule(_localctx, 42, RULE_exprlist);
        int _la;
        try {
            int _alt;
            enterOuterAlt(_localctx, 1);
            {
                setState(370);
                expr(0);
                setState(375);
                _errHandler.sync(this);
                _alt = getInterpreter().adaptivePredict(_input, 47, _ctx);
                while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) {
                    if (_alt == 1) {
                        {
                            {
                                setState(371);
                                match(COMMA);
                                setState(372);
                                expr(0);
                            }
                        }
                    }
                    setState(377);
                    _errHandler.sync(this);
                    _alt = getInterpreter().adaptivePredict(_input, 47, _ctx);
                }
                setState(379);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == COMMA) {
                    {
                        setState(378);
                        match(COMMA);
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class ArglistContext extends ParserRuleContext {
        public List<ArgumentContext> argument() {
            return getRuleContexts(ArgumentContext.class);
        }

        public ArgumentContext argument(int i) {
            return getRuleContext(ArgumentContext.class, i);
        }

        public List<TerminalNode> COMMA() {
            return getTokens(Python3Parser.COMMA);
        }

        public TerminalNode COMMA(int i) {
            return getToken(Python3Parser.COMMA, i);
        }

        public ArglistContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_arglist;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterArglist(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitArglist(this);
        }
    }

    public final ArglistContext arglist() throws RecognitionException {
        ArglistContext _localctx = new ArglistContext(_ctx, getState());
        enterRule(_localctx, 44, RULE_arglist);
        int _la;
        try {
            int _alt;
            enterOuterAlt(_localctx, 1);
            {
                setState(381);
                argument();
                setState(386);
                _errHandler.sync(this);
                _alt = getInterpreter().adaptivePredict(_input, 49, _ctx);
                while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) {
                    if (_alt == 1) {
                        {
                            {
                                setState(382);
                                match(COMMA);
                                setState(383);
                                argument();
                            }
                        }
                    }
                    setState(388);
                    _errHandler.sync(this);
                    _alt = getInterpreter().adaptivePredict(_input, 49, _ctx);
                }
                setState(390);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == COMMA) {
                    {
                        setState(389);
                        match(COMMA);
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class ArgumentContext extends ParserRuleContext {
        public List<ExprContext> expr() {
            return getRuleContexts(ExprContext.class);
        }

        public ExprContext expr(int i) {
            return getRuleContext(ExprContext.class, i);
        }

        public Comp_forContext comp_for() {
            return getRuleContext(Comp_forContext.class, 0);
        }

        public TerminalNode ASSIGN() {
            return getToken(Python3Parser.ASSIGN, 0);
        }

        public ArgumentContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_argument;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterArgument(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitArgument(this);
        }
    }

    public final ArgumentContext argument() throws RecognitionException {
        ArgumentContext _localctx = new ArgumentContext(_ctx, getState());
        enterRule(_localctx, 46, RULE_argument);
        int _la;
        try {
            setState(400);
            _errHandler.sync(this);
            switch (getInterpreter().adaptivePredict(_input, 52, _ctx)) {
                case 1:
                    enterOuterAlt(_localctx, 1); {
                    setState(392);
                    expr(0);
                    setState(394);
                    _errHandler.sync(this);
                    _la = _input.LA(1);
                    if (_la == FOR) {
                        {
                            setState(393);
                            comp_for();
                        }
                    }
                }
                    break;
                case 2:
                    enterOuterAlt(_localctx, 2); {
                    setState(396);
                    expr(0);
                    setState(397);
                    match(ASSIGN);
                    setState(398);
                    expr(0);
                }
                    break;
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Comp_iterContext extends ParserRuleContext {
        public Comp_forContext comp_for() {
            return getRuleContext(Comp_forContext.class, 0);
        }

        public Comp_ifContext comp_if() {
            return getRuleContext(Comp_ifContext.class, 0);
        }

        public Comp_iterContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_comp_iter;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterComp_iter(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitComp_iter(this);
        }
    }

    public final Comp_iterContext comp_iter() throws RecognitionException {
        Comp_iterContext _localctx = new Comp_iterContext(_ctx, getState());
        enterRule(_localctx, 48, RULE_comp_iter);
        try {
            setState(404);
            _errHandler.sync(this);
            switch (_input.LA(1)) {
                case FOR:
                    enterOuterAlt(_localctx, 1); {
                    setState(402);
                    comp_for();
                }
                    break;
                case IF:
                    enterOuterAlt(_localctx, 2); {
                    setState(403);
                    comp_if();
                }
                    break;
                default:
                    throw new NoViableAltException(this);
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Comp_forContext extends ParserRuleContext {
        public TerminalNode FOR() {
            return getToken(Python3Parser.FOR, 0);
        }

        public ExprlistContext exprlist() {
            return getRuleContext(ExprlistContext.class, 0);
        }

        public TerminalNode IN() {
            return getToken(Python3Parser.IN, 0);
        }

        public ExprContext expr() {
            return getRuleContext(ExprContext.class, 0);
        }

        public Comp_iterContext comp_iter() {
            return getRuleContext(Comp_iterContext.class, 0);
        }

        public Comp_forContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_comp_for;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterComp_for(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitComp_for(this);
        }
    }

    public final Comp_forContext comp_for() throws RecognitionException {
        Comp_forContext _localctx = new Comp_forContext(_ctx, getState());
        enterRule(_localctx, 50, RULE_comp_for);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(406);
                match(FOR);
                setState(407);
                exprlist();
                setState(408);
                match(IN);
                setState(409);
                expr(0);
                setState(411);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == FOR || _la == IF) {
                    {
                        setState(410);
                        comp_iter();
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    @SuppressWarnings("CheckReturnValue")
    public static class Comp_ifContext extends ParserRuleContext {
        public TerminalNode IF() {
            return getToken(Python3Parser.IF, 0);
        }

        public ExprContext expr() {
            return getRuleContext(ExprContext.class, 0);
        }

        public Comp_iterContext comp_iter() {
            return getRuleContext(Comp_iterContext.class, 0);
        }

        public Comp_ifContext(ParserRuleContext parent, int invokingState) {
            super(parent, invokingState);
        }

        @Override
        public int getRuleIndex() {
            return RULE_comp_if;
        }

        @Override
        public void enterRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).enterComp_if(this);
        }

        @Override
        public void exitRule(ParseTreeListener listener) {
            if (listener instanceof Python3ParserListener)
                ((Python3ParserListener) listener).exitComp_if(this);
        }
    }

    public final Comp_ifContext comp_if() throws RecognitionException {
        Comp_ifContext _localctx = new Comp_ifContext(_ctx, getState());
        enterRule(_localctx, 52, RULE_comp_if);
        int _la;
        try {
            enterOuterAlt(_localctx, 1);
            {
                setState(413);
                match(IF);
                setState(414);
                expr(0);
                setState(416);
                _errHandler.sync(this);
                _la = _input.LA(1);
                if (_la == FOR || _la == IF) {
                    {
                        setState(415);
                        comp_iter();
                    }
                }
            }
        } catch (RecognitionException re) {
            _localctx.exception = re;
            _errHandler.reportError(this, re);
            _errHandler.recover(this, re);
        } finally {
            exitRule();
        }
        return _localctx;
    }

    public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
        switch (ruleIndex) {
            case 17:
                return expr_sempred((ExprContext) _localctx, predIndex);
        }
        return true;
    }

    private boolean expr_sempred(ExprContext _localctx, int predIndex) {
        switch (predIndex) {
            case 0:
                return precpred(_ctx, 13);
            case 1:
                return precpred(_ctx, 11);
            case 2:
                return precpred(_ctx, 10);
            case 3:
                return precpred(_ctx, 9);
            case 4:
                return precpred(_ctx, 8);
            case 5:
                return precpred(_ctx, 7);
            case 6:
                return precpred(_ctx, 6);
            case 7:
                return precpred(_ctx, 4);
            case 8:
                return precpred(_ctx, 3);
            case 9:
                return precpred(_ctx, 2);
            case 10:
                return precpred(_ctx, 1);
        }
        return true;
    }

    public static final String _serializedATN = "\u0004\u0001L\u01a3\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"
            + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"
            + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"
            + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"
            + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"
            + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"
            + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"
            + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"
            + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0001\u0000\u0005\u0000"
            + "8\b\u0000\n\u0000\f\u0000;\t\u0000\u0001\u0000\u0001\u0000\u0005\u0000"
            + "?\b\u0000\n\u0000\f\u0000B\t\u0000\u0001\u0000\u0001\u0000\u0001\u0001"
            + "\u0001\u0001\u0001\u0001\u0005\u0001I\b\u0001\n\u0001\f\u0001L\t\u0001"
            + "\u0001\u0001\u0003\u0001O\b\u0001\u0001\u0001\u0001\u0001\u0001\u0002"
            + "\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002W\b\u0002\u0001\u0003"
            + "\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003]\b\u0003\u0001\u0004"
            + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0003\u0005"
            + "e\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006"
            + "k\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"
            + "\u0001\u0006\u0005\u0006s\b\u0006\n\u0006\f\u0006v\t\u0006\u0001\u0006"
            + "\u0003\u0006y\b\u0006\u0003\u0006{\b\u0006\u0001\u0007\u0001\u0007\u0001"
            + "\u0007\u0005\u0007\u0080\b\u0007\n\u0007\f\u0007\u0083\t\u0007\u0001\b"
            + "\u0001\b\u0001\b\u0001\b\u0003\b\u0089\b\b\u0001\b\u0001\b\u0001\b\u0001"
            + "\b\u0001\t\u0001\t\u0001\t\u0003\t\u0092\b\t\u0001\t\u0001\t\u0001\t\u0001"
            + "\t\u0003\t\u0098\b\t\u0005\t\u009a\b\t\n\t\f\t\u009d\t\t\u0001\n\u0001"
            + "\n\u0001\n\u0003\n\u00a2\b\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001"
            + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0005\f\u00af\b\f\n"
            + "\f\f\f\u00b2\t\f\u0001\f\u0001\f\u0001\f\u0003\f\u00b7\b\f\u0001\r\u0001"
            + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u00c0\b\r\u0001\u000e"
            + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"
            + "\u0003\u000e\u00c9\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"
            + "\u0001\u000f\u0004\u000f\u00d0\b\u000f\u000b\u000f\f\u000f\u00d1\u0001"
            + "\u000f\u0001\u000f\u0003\u000f\u00d6\b\u000f\u0001\u0010\u0001\u0010\u0001"
            + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"
            + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u00e5"
            + "\b\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u00ea\b\u0011"
            + "\n\u0011\f\u0011\u00ed\t\u0011\u0001\u0011\u0004\u0011\u00f0\b\u0011\u000b"
            + "\u0011\f\u0011\u00f1\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u00f7"
            + "\b\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"
            + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"
            + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"
            + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"
            + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"
            + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"
            + "\u0011\u0001\u0011\u0005\u0011\u011e\b\u0011\n\u0011\f\u0011\u0121\t\u0011"
            + "\u0001\u0012\u0001\u0012\u0003\u0012\u0125\b\u0012\u0001\u0012\u0001\u0012"
            + "\u0001\u0012\u0003\u0012\u012a\b\u0012\u0001\u0012\u0001\u0012\u0001\u0012"
            + "\u0003\u0012\u012f\b\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"
            + "\u0004\u0012\u0135\b\u0012\u000b\u0012\f\u0012\u0136\u0001\u0012\u0001"
            + "\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u013d\b\u0012\u0001\u0013\u0001"
            + "\u0013\u0001\u0013\u0001\u0013\u0005\u0013\u0143\b\u0013\n\u0013\f\u0013"
            + "\u0146\t\u0013\u0001\u0013\u0003\u0013\u0149\b\u0013\u0003\u0013\u014b"
            + "\b\u0013\u0001\u0014\u0001\u0014\u0003\u0014\u014f\b\u0014\u0001\u0014"
            + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0156\b\u0014"
            + "\n\u0014\f\u0014\u0159\t\u0014\u0001\u0014\u0003\u0014\u015c\b\u0014\u0001"
            + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0003"
            + "\u0014\u0164\b\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u0168\b\u0014"
            + "\u0001\u0014\u0001\u0014\u0003\u0014\u016c\b\u0014\u0003\u0014\u016e\b"
            + "\u0014\u0001\u0014\u0003\u0014\u0171\b\u0014\u0001\u0015\u0001\u0015\u0001"
            + "\u0015\u0005\u0015\u0176\b\u0015\n\u0015\f\u0015\u0179\t\u0015\u0001\u0015"
            + "\u0003\u0015\u017c\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016"
            + "\u0181\b\u0016\n\u0016\f\u0016\u0184\t\u0016\u0001\u0016\u0003\u0016\u0187"
            + "\b\u0016\u0001\u0017\u0001\u0017\u0003\u0017\u018b\b\u0017\u0001\u0017"
            + "\u0001\u0017\u0001\u0017\u0001\u0017\u0003\u0017\u0191\b\u0017\u0001\u0018"
            + "\u0001\u0018\u0003\u0018\u0195\b\u0018\u0001\u0019\u0001\u0019\u0001\u0019"
            + "\u0001\u0019\u0001\u0019\u0003\u0019\u019c\b\u0019\u0001\u001a\u0001\u001a"
            + "\u0001\u001a\u0003\u001a\u01a1\b\u001a\u0001\u001a\u0000\u0001\"\u001b"
            + "\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a"
            + "\u001c\u001e \"$&(*,.024\u0000\u0005\u0002\u0000%%>J\u0002\u0000-.22\u0003"
            + "\u0000\u001e\u001e/1<<\u0001\u0000-.\u0001\u0000+,\u01e0\u00009\u0001"
            + "\u0000\u0000\u0000\u0002E\u0001\u0000\u0000\u0000\u0004V\u0001\u0000\u0000"
            + "\u0000\u0006\\\u0001\u0000\u0000\u0000\b^\u0001\u0000\u0000\u0000\nb\u0001"
            + "\u0000\u0000\u0000\fz\u0001\u0000\u0000\u0000\u000e|\u0001\u0000\u0000"
            + "\u0000\u0010\u0084\u0001\u0000\u0000\u0000\u0012\u008e\u0001\u0000\u0000"
            + "\u0000\u0014\u009e\u0001\u0000\u0000\u0000\u0016\u00a3\u0001\u0000\u0000"
            + "\u0000\u0018\u00a5\u0001\u0000\u0000\u0000\u001a\u00b8\u0001\u0000\u0000"
            + "\u0000\u001c\u00c1\u0001\u0000\u0000\u0000\u001e\u00d5\u0001\u0000\u0000"
            + "\u0000 \u00e4\u0001\u0000\u0000\u0000\"\u00f6\u0001\u0000\u0000\u0000"
            + "$\u013c\u0001\u0000\u0000\u0000&\u013e\u0001\u0000\u0000\u0000(\u0170"
            + "\u0001\u0000\u0000\u0000*\u0172\u0001\u0000\u0000\u0000,\u017d\u0001\u0000"
            + "\u0000\u0000.\u0190\u0001\u0000\u0000\u00000\u0194\u0001\u0000\u0000\u0000"
            + "2\u0196\u0001\u0000\u0000\u00004\u019d\u0001\u0000\u0000\u000068\u0005"
            + "\u0018\u0000\u000076\u0001\u0000\u0000\u00008;\u0001\u0000\u0000\u0000"
            + "97\u0001\u0000\u0000\u00009:\u0001\u0000\u0000\u0000:@\u0001\u0000\u0000"
            + "\u0000;9\u0001\u0000\u0000\u0000<?\u0003\u0002\u0001\u0000=?\u0003\u0004"
            + "\u0002\u0000><\u0001\u0000\u0000\u0000>=\u0001\u0000\u0000\u0000?B\u0001"
            + "\u0000\u0000\u0000@>\u0001\u0000\u0000\u0000@A\u0001\u0000\u0000\u0000"
            + "AC\u0001\u0000\u0000\u0000B@\u0001\u0000\u0000\u0000CD\u0005\u0000\u0000"
            + "\u0001D\u0001\u0001\u0000\u0000\u0000EJ\u0003\u0006\u0003\u0000FG\u0005"
            + "#\u0000\u0000GI\u0003\u0006\u0003\u0000HF\u0001\u0000\u0000\u0000IL\u0001"
            + "\u0000\u0000\u0000JH\u0001\u0000\u0000\u0000JK\u0001\u0000\u0000\u0000"
            + "KN\u0001\u0000\u0000\u0000LJ\u0001\u0000\u0000\u0000MO\u0005#\u0000\u0000"
            + "NM\u0001\u0000\u0000\u0000NO\u0001\u0000\u0000\u0000OP\u0001\u0000\u0000"
            + "\u0000PQ\u0005\u0018\u0000\u0000Q\u0003\u0001\u0000\u0000\u0000RW\u0003"
            + "\u0018\f\u0000SW\u0003\u001a\r\u0000TW\u0003\u001c\u000e\u0000UW\u0003"
            + "\u0010\b\u0000VR\u0001\u0000\u0000\u0000VS\u0001\u0000\u0000\u0000VT\u0001"
            + "\u0000\u0000\u0000VU\u0001\u0000\u0000\u0000W\u0005\u0001\u0000\u0000"
            + "\u0000X]\u0003\b\u0004\u0000Y]\u0003\"\u0011\u0000Z]\u0003\n\u0005\u0000"
            + "[]\u0003\f\u0006\u0000\\X\u0001\u0000\u0000\u0000\\Y\u0001\u0000\u0000"
            + "\u0000\\Z\u0001\u0000\u0000\u0000\\[\u0001\u0000\u0000\u0000]\u0007\u0001"
            + "\u0000\u0000\u0000^_\u0003*\u0015\u0000_`\u0003\u0016\u000b\u0000`a\u0003"
            + "*\u0015\u0000a\t\u0001\u0000\u0000\u0000bd\u0005\u0014\u0000\u0000ce\u0003"
            + "*\u0015\u0000dc\u0001\u0000\u0000\u0000de\u0001\u0000\u0000\u0000e\u000b"
            + "\u0001\u0000\u0000\u0000fg\u0005\u000e\u0000\u0000gj\u0003\u000e\u0007"
            + "\u0000hi\u0005\u0006\u0000\u0000ik\u0005\u0019\u0000\u0000jh\u0001\u0000"
            + "\u0000\u0000jk\u0001\u0000\u0000\u0000k{\u0001\u0000\u0000\u0000lm\u0005"
            + "\f\u0000\u0000mn\u0003\u000e\u0007\u0000nx\u0005\u000e\u0000\u0000ot\u0005"
            + "\u0019\u0000\u0000pq\u0005!\u0000\u0000qs\u0005\u0019\u0000\u0000rp\u0001"
            + "\u0000\u0000\u0000sv\u0001\u0000\u0000\u0000tr\u0001\u0000\u0000\u0000"
            + "tu\u0001\u0000\u0000\u0000uy\u0001\u0000\u0000\u0000vt\u0001\u0000\u0000"
            + "\u0000wy\u0005\u001e\u0000\u0000xo\u0001\u0000\u0000\u0000xw\u0001\u0000"
            + "\u0000\u0000y{\u0001\u0000\u0000\u0000zf\u0001\u0000\u0000\u0000zl\u0001"
            + "\u0000\u0000\u0000{\r\u0001\u0000\u0000\u0000|\u0081\u0005\u0019\u0000"
            + "\u0000}~\u0005\u001c\u0000\u0000~\u0080\u0005\u0019\u0000\u0000\u007f"
            + "}\u0001\u0000\u0000\u0000\u0080\u0083\u0001\u0000\u0000\u0000\u0081\u007f"
            + "\u0001\u0000\u0000\u0000\u0081\u0082\u0001\u0000\u0000\u0000\u0082\u000f"
            + "\u0001\u0000\u0000\u0000\u0083\u0081\u0001\u0000\u0000\u0000\u0084\u0085"
            + "\u0005\u0007\u0000\u0000\u0085\u0086\u0005\u0019\u0000\u0000\u0086\u0088"
            + "\u0005\u001f\u0000\u0000\u0087\u0089\u0003\u0012\t\u0000\u0088\u0087\u0001"
            + "\u0000\u0000\u0000\u0088\u0089\u0001\u0000\u0000\u0000\u0089\u008a\u0001"
            + "\u0000\u0000\u0000\u008a\u008b\u0005 \u0000\u0000\u008b\u008c\u0005\""
            + "\u0000\u0000\u008c\u008d\u0003\u001e\u000f\u0000\u008d\u0011\u0001\u0000"
            + "\u0000\u0000\u008e\u0091\u0003\u0014\n\u0000\u008f\u0090\u0005%\u0000"
            + "\u0000\u0090\u0092\u0003\"\u0011\u0000\u0091\u008f\u0001\u0000\u0000\u0000"
            + "\u0091\u0092\u0001\u0000\u0000\u0000\u0092\u009b\u0001\u0000\u0000\u0000"
            + "\u0093\u0094\u0005!\u0000\u0000\u0094\u0097\u0003\u0014\n\u0000\u0095"
            + "\u0096\u0005%\u0000\u0000\u0096\u0098\u0003\"\u0011\u0000\u0097\u0095"
            + "\u0001\u0000\u0000\u0000\u0097\u0098\u0001\u0000\u0000\u0000\u0098\u009a"
            + "\u0001\u0000\u0000\u0000\u0099\u0093\u0001\u0000\u0000\u0000\u009a\u009d"
            + "\u0001\u0000\u0000\u0000\u009b\u0099\u0001\u0000\u0000\u0000\u009b\u009c"
            + "\u0001\u0000\u0000\u0000\u009c\u0013\u0001\u0000\u0000\u0000\u009d\u009b"
            + "\u0001\u0000\u0000\u0000\u009e\u00a1\u0005\u0019\u0000\u0000\u009f\u00a0"
            + "\u0005\"\u0000\u0000\u00a0\u00a2\u0003\"\u0011\u0000\u00a1\u009f\u0001"
            + "\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000\u0000\u0000\u00a2\u0015\u0001"
            + "\u0000\u0000\u0000\u00a3\u00a4\u0007\u0000\u0000\u0000\u00a4\u0017\u0001"
            + "\u0000\u0000\u0000\u00a5\u00a6\u0005\r\u0000\u0000\u00a6\u00a7\u0003\""
            + "\u0011\u0000\u00a7\u00a8\u0005\"\u0000\u0000\u00a8\u00b0\u0003\u001e\u000f"
            + "\u0000\u00a9\u00aa\u0005\b\u0000\u0000\u00aa\u00ab\u0003\"\u0011\u0000"
            + "\u00ab\u00ac\u0005\"\u0000\u0000\u00ac\u00ad\u0003\u001e\u000f\u0000\u00ad"
            + "\u00af\u0001\u0000\u0000\u0000\u00ae\u00a9\u0001\u0000\u0000\u0000\u00af"
            + "\u00b2\u0001\u0000\u0000\u0000\u00b0\u00ae\u0001\u0000\u0000\u0000\u00b0"
            + "\u00b1\u0001\u0000\u0000\u0000\u00b1\u00b6\u0001\u0000\u0000\u0000\u00b2"
            + "\u00b0\u0001\u0000\u0000\u0000\u00b3\u00b4\u0005\t\u0000\u0000\u00b4\u00b5"
            + "\u0005\"\u0000\u0000\u00b5\u00b7\u0003\u001e\u000f\u0000\u00b6\u00b3\u0001"
            + "\u0000\u0000\u0000\u00b6\u00b7\u0001\u0000\u0000\u0000\u00b7\u0019\u0001"
            + "\u0000\u0000\u0000\u00b8\u00b9\u0005\u0017\u0000\u0000\u00b9\u00ba\u0003"
            + "\"\u0011\u0000\u00ba\u00bb\u0005\"\u0000\u0000\u00bb\u00bf\u0003\u001e"
            + "\u000f\u0000\u00bc\u00bd\u0005\t\u0000\u0000\u00bd\u00be\u0005\"\u0000"
            + "\u0000\u00be\u00c0\u0003\u001e\u000f\u0000\u00bf\u00bc\u0001\u0000\u0000"
            + "\u0000\u00bf\u00c0\u0001\u0000\u0000\u0000\u00c0\u001b\u0001\u0000\u0000"
            + "\u0000\u00c1\u00c2\u0005\u000b\u0000\u0000\u00c2\u00c3\u0003*\u0015\u0000"
            + "\u00c3\u00c4\u0005\"\u0000\u0000\u00c4\u00c8\u0003\u001e\u000f\u0000\u00c5"
            + "\u00c6\u0005\t\u0000\u0000\u00c6\u00c7\u0005\"\u0000\u0000\u00c7\u00c9"
            + "\u0003\u001e\u000f\u0000\u00c8\u00c5\u0001\u0000\u0000\u0000\u00c8\u00c9"
            + "\u0001\u0000\u0000\u0000\u00c9\u001d\u0001\u0000\u0000\u0000\u00ca\u00d6"
            + "\u0003\u0002\u0001\u0000\u00cb\u00cc\u0005\u0018\u0000\u0000\u00cc\u00cf"
            + "\u0005\u0001\u0000\u0000\u00cd\u00d0\u0003\u0002\u0001\u0000\u00ce\u00d0"
            + "\u0003\u0004\u0002\u0000\u00cf\u00cd\u0001\u0000\u0000\u0000\u00cf\u00ce"
            + "\u0001\u0000\u0000\u0000\u00d0\u00d1\u0001\u0000\u0000\u0000\u00d1\u00cf"
            + "\u0001\u0000\u0000\u0000\u00d1\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d3"
            + "\u0001\u0000\u0000\u0000\u00d3\u00d4\u0005\u0002\u0000\u0000\u00d4\u00d6"
            + "\u0001\u0000\u0000\u0000\u00d5\u00ca\u0001\u0000\u0000\u0000\u00d5\u00cb"
            + "\u0001\u0000\u0000\u0000\u00d6\u001f\u0001\u0000\u0000\u0000\u00d7\u00e5"
            + "\u00055\u0000\u0000\u00d8\u00e5\u00056\u0000\u0000\u00d9\u00e5\u00057"
            + "\u0000\u0000\u00da\u00e5\u00058\u0000\u0000\u00db\u00e5\u00059\u0000\u0000"
            + "\u00dc\u00e5\u0005:\u0000\u0000\u00dd\u00e5\u0005;\u0000\u0000\u00de\u00e5"
            + "\u0005\u000f\u0000\u0000\u00df\u00e0\u0005\u0012\u0000\u0000\u00e0\u00e5"
            + "\u0005\u000f\u0000\u0000\u00e1\u00e5\u0005\u0010\u0000\u0000\u00e2\u00e3"
            + "\u0005\u0010\u0000\u0000\u00e3\u00e5\u0005\u0012\u0000\u0000\u00e4\u00d7"
            + "\u0001\u0000\u0000\u0000\u00e4\u00d8\u0001\u0000\u0000\u0000\u00e4\u00d9"
            + "\u0001\u0000\u0000\u0000\u00e4\u00da\u0001\u0000\u0000\u0000\u00e4\u00db"
            + "\u0001\u0000\u0000\u0000\u00e4\u00dc\u0001\u0000\u0000\u0000\u00e4\u00dd"
            + "\u0001\u0000\u0000\u0000\u00e4\u00de\u0001\u0000\u0000\u0000\u00e4\u00df"
            + "\u0001\u0000\u0000\u0000\u00e4\u00e1\u0001\u0000\u0000\u0000\u00e4\u00e2"
            + "\u0001\u0000\u0000\u0000\u00e5!\u0001\u0000\u0000\u0000\u00e6\u00e7\u0006"
            + "\u0011\uffff\uffff\u0000\u00e7\u00eb\u0003$\u0012\u0000\u00e8\u00ea\u0003"
            + "(\u0014\u0000\u00e9\u00e8\u0001\u0000\u0000\u0000\u00ea\u00ed\u0001\u0000"
            + "\u0000\u0000\u00eb\u00e9\u0001\u0000\u0000\u0000\u00eb\u00ec\u0001\u0000"
            + "\u0000\u0000\u00ec\u00f7\u0001\u0000\u0000\u0000\u00ed\u00eb\u0001\u0000"
            + "\u0000\u0000\u00ee\u00f0\u0007\u0001\u0000\u0000\u00ef\u00ee\u0001\u0000"
            + "\u0000\u0000\u00f0\u00f1\u0001\u0000\u0000\u0000\u00f1\u00ef\u0001\u0000"
            + "\u0000\u0000\u00f1\u00f2\u0001\u0000\u0000\u0000\u00f2\u00f3\u0001\u0000"
            + "\u0000\u0000\u00f3\u00f7\u0003\"\u0011\f\u00f4\u00f5\u0005\u0012\u0000"
            + "\u0000\u00f5\u00f7\u0003\"\u0011\u0005\u00f6\u00e6\u0001\u0000\u0000\u0000"
            + "\u00f6\u00ef\u0001\u0000\u0000\u0000\u00f6\u00f4\u0001\u0000\u0000\u0000"
            + "\u00f7\u011f\u0001\u0000\u0000\u0000\u00f8\u00f9\n\r\u0000\u0000\u00f9"
            + "\u00fa\u0005$\u0000\u0000\u00fa\u011e\u0003\"\u0011\u000e\u00fb\u00fc"
            + "\n\u000b\u0000\u0000\u00fc\u00fd\u0007\u0002\u0000\u0000\u00fd\u011e\u0003"
            + "\"\u0011\f\u00fe\u00ff\n\n\u0000\u0000\u00ff\u0100\u0007\u0003\u0000\u0000"
            + "\u0100\u011e\u0003\"\u0011\u000b\u0101\u0102\n\t\u0000\u0000\u0102\u0103"
            + "\u0007\u0004\u0000\u0000\u0103\u011e\u0003\"\u0011\n\u0104\u0105\n\b\u0000"
            + "\u0000\u0105\u0106\u0005*\u0000\u0000\u0106\u011e\u0003\"\u0011\t\u0107"
            + "\u0108\n\u0007\u0000\u0000\u0108\u0109\u0005)\u0000\u0000\u0109\u011e"
            + "\u0003\"\u0011\b\u010a\u010b\n\u0006\u0000\u0000\u010b\u010c\u0005(\u0000"
            + "\u0000\u010c\u011e\u0003\"\u0011\u0007\u010d\u010e\n\u0004\u0000\u0000"
            + "\u010e\u010f\u0003 \u0010\u0000\u010f\u0110\u0003\"\u0011\u0005\u0110"
            + "\u011e\u0001\u0000\u0000\u0000\u0111\u0112\n\u0003\u0000\u0000\u0112\u0113"
            + "\u0005\u0005\u0000\u0000\u0113\u011e\u0003\"\u0011\u0004\u0114\u0115\n"
            + "\u0002\u0000\u0000\u0115\u0116\u0005\u0013\u0000\u0000\u0116\u011e\u0003"
            + "\"\u0011\u0003\u0117\u0118\n\u0001\u0000\u0000\u0118\u0119\u0005\r\u0000"
            + "\u0000\u0119\u011a\u0003\"\u0011\u0000\u011a\u011b\u0005\t\u0000\u0000"
            + "\u011b\u011c\u0003\"\u0011\u0002\u011c\u011e\u0001\u0000\u0000\u0000\u011d"
            + "\u00f8\u0001\u0000\u0000\u0000\u011d\u00fb\u0001\u0000\u0000\u0000\u011d"
            + "\u00fe\u0001\u0000\u0000\u0000\u011d\u0101\u0001\u0000\u0000\u0000\u011d"
            + "\u0104\u0001\u0000\u0000\u0000\u011d\u0107\u0001\u0000\u0000\u0000\u011d"
            + "\u010a\u0001\u0000\u0000\u0000\u011d\u010d\u0001\u0000\u0000\u0000\u011d"
            + "\u0111\u0001\u0000\u0000\u0000\u011d\u0114\u0001\u0000\u0000\u0000\u011d"
            + "\u0117\u0001\u0000\u0000\u0000\u011e\u0121\u0001\u0000\u0000\u0000\u011f"
            + "\u011d\u0001\u0000\u0000\u0000\u011f\u0120\u0001\u0000\u0000\u0000\u0120"
            + "#\u0001\u0000\u0000\u0000\u0121\u011f\u0001\u0000\u0000\u0000\u0122\u0124"
            + "\u0005\u001f\u0000\u0000\u0123\u0125\u0003&\u0013\u0000\u0124\u0123\u0001"
            + "\u0000\u0000\u0000\u0124\u0125\u0001\u0000\u0000\u0000\u0125\u0126\u0001"
            + "\u0000\u0000\u0000\u0126\u013d\u0005 \u0000\u0000\u0127\u0129\u0005&\u0000"
            + "\u0000\u0128\u012a\u0003&\u0013\u0000\u0129\u0128\u0001\u0000\u0000\u0000"
            + "\u0129\u012a\u0001\u0000\u0000\u0000\u012a\u012b\u0001\u0000\u0000\u0000"
            + "\u012b\u013d\u0005\'\u0000\u0000\u012c\u012e\u00053\u0000\u0000\u012d"
            + "\u012f\u0003&\u0013\u0000\u012e\u012d\u0001\u0000\u0000\u0000\u012e\u012f"
            + "\u0001\u0000\u0000\u0000\u012f\u0130\u0001\u0000\u0000\u0000\u0130\u013d"
            + "\u00054\u0000\u0000\u0131\u013d\u0005\u0019\u0000\u0000\u0132\u013d\u0005"
            + "\u0004\u0000\u0000\u0133\u0135\u0005\u0003\u0000\u0000\u0134\u0133\u0001"
            + "\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000\u0136\u0134\u0001"
            + "\u0000\u0000\u0000\u0136\u0137\u0001\u0000\u0000\u0000\u0137\u013d\u0001"
            + "\u0000\u0000\u0000\u0138\u013d\u0005\u001d\u0000\u0000\u0139\u013d\u0005"
            + "\u0011\u0000\u0000\u013a\u013d\u0005\u0015\u0000\u0000\u013b\u013d\u0005"
            + "\n\u0000\u0000\u013c\u0122\u0001\u0000\u0000\u0000\u013c\u0127\u0001\u0000"
            + "\u0000\u0000\u013c\u012c\u0001\u0000\u0000\u0000\u013c\u0131\u0001\u0000"
            + "\u0000\u0000\u013c\u0132\u0001\u0000\u0000\u0000\u013c\u0134\u0001\u0000"
            + "\u0000\u0000\u013c\u0138\u0001\u0000\u0000\u0000\u013c\u0139\u0001\u0000"
            + "\u0000\u0000\u013c\u013a\u0001\u0000\u0000\u0000\u013c\u013b\u0001\u0000"
            + "\u0000\u0000\u013d%\u0001\u0000\u0000\u0000\u013e\u014a\u0003\"\u0011"
            + "\u0000\u013f\u014b\u00032\u0019\u0000\u0140\u0141\u0005!\u0000\u0000\u0141"
            + "\u0143\u0003\"\u0011\u0000\u0142\u0140\u0001\u0000\u0000\u0000\u0143\u0146"
            + "\u0001\u0000\u0000\u0000\u0144\u0142\u0001\u0000\u0000\u0000\u0144\u0145"
            + "\u0001\u0000\u0000\u0000\u0145\u0148\u0001\u0000\u0000\u0000\u0146\u0144"
            + "\u0001\u0000\u0000\u0000\u0147\u0149\u0005!\u0000\u0000\u0148\u0147\u0001"
            + "\u0000\u0000\u0000\u0148\u0149\u0001\u0000\u0000\u0000\u0149\u014b\u0001"
            + "\u0000\u0000\u0000\u014a\u013f\u0001\u0000\u0000\u0000\u014a\u0144\u0001"
            + "\u0000\u0000\u0000\u014b\'\u0001\u0000\u0000\u0000\u014c\u014e\u0005\u001f"
            + "\u0000\u0000\u014d\u014f\u0003,\u0016\u0000\u014e\u014d\u0001\u0000\u0000"
            + "\u0000\u014e\u014f\u0001\u0000\u0000\u0000\u014f\u0150\u0001\u0000\u0000"
            + "\u0000\u0150\u0171\u0005 \u0000\u0000\u0151\u0152\u0005&\u0000\u0000\u0152"
            + "\u0157\u0003\"\u0011\u0000\u0153\u0154\u0005!\u0000\u0000\u0154\u0156"
            + "\u0003\"\u0011\u0000\u0155\u0153\u0001\u0000\u0000\u0000\u0156\u0159\u0001"
            + "\u0000\u0000\u0000\u0157\u0155\u0001\u0000\u0000\u0000\u0157\u0158\u0001"
            + "\u0000\u0000\u0000\u0158\u015b\u0001\u0000\u0000\u0000\u0159\u0157\u0001"
            + "\u0000\u0000\u0000\u015a\u015c\u0005!\u0000\u0000\u015b\u015a\u0001\u0000"
            + "\u0000\u0000\u015b\u015c\u0001\u0000\u0000\u0000\u015c\u015d\u0001\u0000"
            + "\u0000\u0000\u015d\u015e\u0005\'\u0000\u0000\u015e\u0171\u0001\u0000\u0000"
            + "\u0000\u015f\u0160\u0005\u001c\u0000\u0000\u0160\u0171\u0005\u0019\u0000"
            + "\u0000\u0161\u0163\u0005&\u0000\u0000\u0162\u0164\u0003\"\u0011\u0000"
            + "\u0163\u0162\u0001\u0000\u0000\u0000\u0163\u0164\u0001\u0000\u0000\u0000"
            + "\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u0167\u0005\"\u0000\u0000\u0166"
            + "\u0168\u0003\"\u0011\u0000\u0167\u0166\u0001\u0000\u0000\u0000\u0167\u0168"
            + "\u0001\u0000\u0000\u0000\u0168\u016d\u0001\u0000\u0000\u0000\u0169\u016b"
            + "\u0005\"\u0000\u0000\u016a\u016c\u0003\"\u0011\u0000\u016b\u016a\u0001"
            + "\u0000\u0000\u0000\u016b\u016c\u0001\u0000\u0000\u0000\u016c\u016e\u0001"
            + "\u0000\u0000\u0000\u016d\u0169\u0001\u0000\u0000\u0000\u016d\u016e\u0001"
            + "\u0000\u0000\u0000\u016e\u016f\u0001\u0000\u0000\u0000\u016f\u0171\u0005"
            + "\'\u0000\u0000\u0170\u014c\u0001\u0000\u0000\u0000\u0170\u0151\u0001\u0000"
            + "\u0000\u0000\u0170\u015f\u0001\u0000\u0000\u0000\u0170\u0161\u0001\u0000"
            + "\u0000\u0000\u0171)\u0001\u0000\u0000\u0000\u0172\u0177\u0003\"\u0011"
            + "\u0000\u0173\u0174\u0005!\u0000\u0000\u0174\u0176\u0003\"\u0011\u0000"
            + "\u0175\u0173\u0001\u0000\u0000\u0000\u0176\u0179\u0001\u0000\u0000\u0000"
            + "\u0177\u0175\u0001\u0000\u0000\u0000\u0177\u0178\u0001\u0000\u0000\u0000"
            + "\u0178\u017b\u0001\u0000\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000"
            + "\u017a\u017c\u0005!\u0000\u0000\u017b\u017a\u0001\u0000\u0000\u0000\u017b"
            + "\u017c\u0001\u0000\u0000\u0000\u017c+\u0001\u0000\u0000\u0000\u017d\u0182"
            + "\u0003.\u0017\u0000\u017e\u017f\u0005!\u0000\u0000\u017f\u0181\u0003."
            + "\u0017\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0184\u0001\u0000"
            + "\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183\u0001\u0000"
            + "\u0000\u0000\u0183\u0186\u0001\u0000\u0000\u0000\u0184\u0182\u0001\u0000"
            + "\u0000\u0000\u0185\u0187\u0005!\u0000\u0000\u0186\u0185\u0001\u0000\u0000"
            + "\u0000\u0186\u0187\u0001\u0000\u0000\u0000\u0187-\u0001\u0000\u0000\u0000"
            + "\u0188\u018a\u0003\"\u0011\u0000\u0189\u018b\u00032\u0019\u0000\u018a"
            + "\u0189\u0001\u0000\u0000\u0000\u018a\u018b\u0001\u0000\u0000\u0000\u018b"
            + "\u0191\u0001\u0000\u0000\u0000\u018c\u018d\u0003\"\u0011\u0000\u018d\u018e"
            + "\u0005%\u0000\u0000\u018e\u018f\u0003\"\u0011\u0000\u018f\u0191\u0001"
            + "\u0000\u0000\u0000\u0190\u0188\u0001\u0000\u0000\u0000\u0190\u018c\u0001"
            + "\u0000\u0000\u0000\u0191/\u0001\u0000\u0000\u0000\u0192\u0195\u00032\u0019"
            + "\u0000\u0193\u0195\u00034\u001a\u0000\u0194\u0192\u0001\u0000\u0000\u0000"
            + "\u0194\u0193\u0001\u0000\u0000\u0000\u01951\u0001\u0000\u0000\u0000\u0196"
            + "\u0197\u0005\u000b\u0000\u0000\u0197\u0198\u0003*\u0015\u0000\u0198\u0199"
            + "\u0005\u000f\u0000\u0000\u0199\u019b\u0003\"\u0011\u0000\u019a\u019c\u0003"
            + "0\u0018\u0000\u019b\u019a\u0001\u0000\u0000\u0000\u019b\u019c\u0001\u0000"
            + "\u0000\u0000\u019c3\u0001\u0000\u0000\u0000\u019d\u019e\u0005\r\u0000"
            + "\u0000\u019e\u01a0\u0003\"\u0011\u0000\u019f\u01a1\u00030\u0018\u0000"
            + "\u01a0\u019f\u0001\u0000\u0000\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000"
            + "\u01a15\u0001\u0000\u0000\u000089>@JNV\\djtxz\u0081\u0088\u0091\u0097"
            + "\u009b\u00a1\u00b0\u00b6\u00bf\u00c8\u00cf\u00d1\u00d5\u00e4\u00eb\u00f1"
            + "\u00f6\u011d\u011f\u0124\u0129\u012e\u0136\u013c\u0144\u0148\u014a\u014e"
            + "\u0157\u015b\u0163\u0167\u016b\u016d\u0170\u0177\u017b\u0182\u0186\u018a"
            + "\u0190\u0194\u019b\u01a0";
    public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray());

    static {
        _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
        for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
            _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
        }
    }
}