diff --git a/config/jflex/.gitignore b/config/jflex/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..37eca22b514d44efc70c028edb68a962aa8f5420
--- /dev/null
+++ b/config/jflex/.gitignore
@@ -0,0 +1 @@
+SmaliTokenMaker.java
diff --git a/config/jflex/README.md b/config/jflex/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8ef7cefd1bfd17f3eb0f531374a1df78c7d3ffc5
--- /dev/null
+++ b/config/jflex/README.md
@@ -0,0 +1,5 @@
+Refer to the following instructions to modify and use to generate SmaliTokenMarker
+
+```shell
+jflex SmaliTokenMaker.flex --skel skeleton.default
+```
diff --git a/config/jflex/SmaliTokenMaker.flex b/config/jflex/SmaliTokenMaker.flex
new file mode 100644
index 0000000000000000000000000000000000000000..fbb962c6c638465c3ef0d8f50785f18d3e663f7f
--- /dev/null
+++ b/config/jflex/SmaliTokenMaker.flex
@@ -0,0 +1,681 @@
+/*
+ * Generated on 11/22/21, 8:58 PM
+ */
+package jadx.gui.ui.codeearea;
+
+import java.io.*;
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+
+/**
+ * 用于Smali代码高亮
+ * MartinKay@qq.com
+ */
+%%
+
+%public
+%class SmaliTokenMaker
+%extends AbstractJFlexCTokenMaker
+%unicode
+/* Case sensitive */
+%type org.fife.ui.rsyntaxtextarea.Token
+
+
+%{
+
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public SmaliTokenMaker() {
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, true);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos-1, tokenType);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start,end, tokenType, so, false);
+ }
+
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start,end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getLineCommentStartAndEnd(int languageIndex) {
+ return new String[] { "#", null };
+ }
+
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from text
. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * text
starts.
+ * @return The first Token
in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ /* No multi-line comments */
+ /* No documentation comments */
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new TokenImpl();
+ }
+
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return true
if EOF was reached, otherwise
+ * false
.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos>=s.offset+s.count;
+ }
+
+
+ /**
+ * Resets the scanner to read from a new input stream.
+ * Does not close the old reader.
+ *
+ * All internal variables are reset, the old input stream
+ * cannot be reused (internal buffer is discarded and lost).
+ * Lexical state is set to YY_INITIAL.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ //zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+
+%}
+
+Letter = [A-Za-z]
+LetterOrUnderscore = ({Letter}|"_")
+NonzeroDigit = [1-9]
+Digit = ("0"|{NonzeroDigit})
+HexDigit = ({Digit}|[A-Fa-f])
+OctalDigit = ([0-7])
+AnyCharacterButApostropheOrBackSlash = ([^\\'])
+AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
+EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
+Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
+NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
+IdentifierStart = ({LetterOrUnderscore}|"$")
+IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
+
+LineTerminator = (\n)
+WhiteSpace = ([ \t\f]+)
+
+CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
+UnclosedCharLiteral = ([\'][^\'\n]*)
+ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
+StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
+UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
+ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
+
+/* No multi-line comments */
+/* No documentation comments */
+LineCommentBegin = "#"
+
+IntegerLiteral = ({Digit}+)
+HexLiteral = (0x{HexDigit}+)
+FloatLiteral = (({Digit}+)("."{Digit}+)?(e[+-]?{Digit}+)? | ({Digit}+)?("."{Digit}+)(e[+-]?{Digit}+)?)
+ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
+BooleanLiteral = ("true"|"false")
+
+Separator = ([\(\)\{\}\[\]])
+Separator2 = ([\;,.])
+
+Identifier = ({IdentifierStart}{IdentifierPart}*)
+
+URLGenDelim = ([:\/\?#\[\]@])
+URLSubDelim = ([\!\$&'\(\)\*\+,;=])
+URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
+URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
+URLCharacters = ({URLCharacter}*)
+URLEndCharacter = ([\/\$]|{Letter}|{Digit})
+URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
+
+
+/* Custom Regex */
+/* fully-qualified name Rules */
+SimpleName = ([a-zA-Z0-9_$]*)
+QUALIFIED_TYPE_NAME = ("L"({SimpleName}{SLASH})*{SimpleName}*";")
+/* Types */
+VOID_TYPE = ("V")
+BOOLEAN_TYPE = ("Z")
+BYTE_TYPE = ("B")
+SHORT_TYPE = ("S")
+CHAR_TYPE = ("C")
+INT_TYPE = ("I")
+LONG_TYPE = ("J")
+FLOAT_TYPE = ("F")
+DOUBLE_TYPE = ("D")
+/* Multi Args Types Highlight */
+MULTI_ARGS_TYPES = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+);
+
+/* Types fully-qualified name */
+COMPOUND_METHOD_ARG_LITERAL = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+{QUALIFIED_TYPE_NAME})
+
+
+LBRACK = ("[")
+RBRACK = ("]")
+LPAREN = ("(")
+RPAREN = (")")
+LBRACE = ("{")
+RBRACE = ("}")
+COLON = (":")
+ASSIGN = ("=")
+DOT = (".")
+SUB = ("-")
+COMMA = (",")
+SLASH = ("/")
+LT = ("<")
+GT = (">")
+ARROW = ("->")
+SEMI = (";")
+ARROW_FUNCTION = ({ARROW}[a-zA-Z_$<>]*)
+CustomSeparator = ({Separator}|{ARROW_FUNCTION})
+
+/* Register */
+VREGISTER = ("v"("0"|[1-9])*)
+PREGISTER = ("p"("0"|[1-9])*)
+
+/* Flags */
+FLAG_PSWITCH = (":pswitch_"{SimpleName})
+FLAG_PSWITCH_DATA = (":pswitch_data_"{SimpleName})
+FLAG_GOTO = (":goto_"{SimpleName})
+FLAG_COND = (":cond_"{SimpleName})
+FLAG_TRY_START = (":try_start_"{SimpleName})
+FLAG_TRY_END = (":try_end_"{SimpleName})
+FLAG_CATCH = (":catch_"{SimpleName})
+FLAG_CATCHALL = (":catchall_"{SimpleName})
+FLAG_ARRAY = (":array_"{SimpleName})
+
+/* No string state */
+/* No char state */
+/* No MLC state */
+/* No documentation comment state */
+%state EOL_COMMENT
+
+%%
+
+ {
+
+ /* Keywords Instructions Highlight */
+"nop" |
+"move" |
+"move/from16" |
+"move/16" |
+"move-wide" |
+"move-wide/from16" |
+"move-wide/16" |
+"move-object" |
+"move-object/from16" |
+"move-object/16" |
+"move-result" |
+"move-result-wide" |
+"move-result-object" |
+"move-exception" |
+"return-void" |
+"return" |
+"return-wide" |
+"return-object" |
+"const/4" |
+"const/16" |
+"const" |
+"const/high16" |
+"const-wide/16" |
+"const-wide/32" |
+"const-wide" |
+"const-wide/high16" |
+"const-string" |
+"const-string/jumbo" |
+"const-class" |
+"monitor-enter" |
+"monitor-exit" |
+"check-cast" |
+"instance-of" |
+"array-length" |
+"new-instance" |
+"new-array" |
+"filled-new-array" |
+"filled-new-array/range" |
+"fill-array-data" |
+"throw" |
+"goto" |
+"goto/16" |
+"goto/32" |
+"cmpl-float" |
+"cmpg-float" |
+"cmpl-double" |
+"cmpg-double" |
+"cmp-long" |
+"if-eq" |
+"if-ne" |
+"if-lt" |
+"if-ge" |
+"if-gt" |
+"if-le" |
+"if-eqz" |
+"if-nez" |
+"if-ltz" |
+"if-gez" |
+"if-gtz" |
+"if-lez" |
+"aget" |
+"aget-wide" |
+"aget-object" |
+"aget-boolean" |
+"aget-byte" |
+"aget-char" |
+"aget-short" |
+"aput" |
+"aput-wide" |
+"aput-object" |
+"aput-boolean" |
+"aput-byte" |
+"aput-char" |
+"aput-short" |
+"iget" |
+"iget-wide" |
+"iget-object" |
+"iget-boolean" |
+"iget-byte" |
+"iget-char" |
+"iget-short" |
+"iput" |
+"iput-wide" |
+"iput-object" |
+"iput-boolean" |
+"iput-byte" |
+"iput-char" |
+"iput-short" |
+"sget" |
+"sget-wide" |
+"sget-object" |
+"sget-boolean" |
+"sget-byte" |
+"sget-char" |
+"sget-short" |
+"sput" |
+"sput-wide" |
+"sput-object" |
+"sput-boolean" |
+"sput-byte" |
+"sput-char" |
+"sput-short" |
+"invoke-virtual" |
+"invoke-super" |
+"invoke-direct" |
+"invoke-static" |
+"invoke-interface" |
+"invoke-virtual/range" |
+"invoke-super/range" |
+"invoke-direct/range" |
+"invoke-static/range" |
+"invoke-interface/range" |
+"neg-int" |
+"not-int" |
+"neg-long" |
+"not-long" |
+"neg-float" |
+"neg-double" |
+"int-to-long" |
+"int-to-float" |
+"int-to-double" |
+"long-to-int" |
+"long-to-float" |
+"long-to-double" |
+"float-to-int" |
+"float-to-long" |
+"float-to-double" |
+"double-to-int" |
+"double-to-long" |
+"double-to-float" |
+"int-to-byte" |
+"int-to-char" |
+"int-to-short" |
+"add-int" |
+"sub-int" |
+"mul-int" |
+"div-int" |
+"rem-int" |
+"and-int" |
+"or-int" |
+"xor-int" |
+"shl-int" |
+"shr-int" |
+"ushr-int" |
+"add-long" |
+"sub-long" |
+"mul-long" |
+"div-long" |
+"rem-long" |
+"and-long" |
+"or-long" |
+"xor-long" |
+"shl-long" |
+"shr-long" |
+"ushr-long" |
+"add-float" |
+"sub-float" |
+"mul-float" |
+"div-float" |
+"rem-float" |
+"add-double" |
+"sub-double" |
+"mul-double" |
+"div-double" |
+"rem-double" |
+"add-int/2addr" |
+"sub-int/2addr" |
+"mul-int/2addr" |
+"div-int/2addr" |
+"rem-int/2addr" |
+"and-int/2addr" |
+"or-int/2addr" |
+"xor-int/2addr" |
+"shl-int/2addr" |
+"shr-int/2addr" |
+"ushr-int/2addr" |
+"add-long/2addr" |
+"sub-long/2addr" |
+"mul-long/2addr" |
+"div-long/2addr" |
+"rem-long/2addr" |
+"and-long/2addr" |
+"or-long/2addr" |
+"xor-long/2addr" |
+"shl-long/2addr" |
+"shr-long/2addr" |
+"ushr-long/2addr" |
+"add-float/2addr" |
+"sub-float/2addr" |
+"mul-float/2addr" |
+"div-float/2addr" |
+"rem-float/2addr" |
+"add-double/2addr" |
+"sub-double/2addr" |
+"mul-double/2addr" |
+"div-double/2addr" |
+"rem-double/2addr" |
+"add-int/lit16" |
+"rsub-int" |
+"mul-int/lit16" |
+"div-int/lit16" |
+"rem-int/lit16" |
+"and-int/lit16" |
+"or-int/lit16" |
+"xor-int/lit16" |
+"add-int/lit8" |
+"rsub-int/lit8" |
+"mul-int/lit8" |
+"div-int/lit8" |
+"rem-int/lit8" |
+"and-int/lit8" |
+"or-int/lit8" |
+"xor-int/lit8" |
+"shl-int/lit8" |
+"shr-int/lit8" |
+"ushr-int/lit8" |
+"invoke-polymorphic" |
+"invoke-polymorphic/range" |
+"invoke-custom" |
+"invoke-custom/range" |
+"const-method-handle" |
+"const-method-type" |
+"packed-switch" |
+"sparse-switch" { addToken(Token.FUNCTION); }
+
+ /* Keywords Modifiers(IDENTIFIER标识符、修饰符) Highlight */
+"public" |
+"private" |
+"protected" |
+"final" |
+"annotation" |
+"static" |
+"synthetic" |
+"constructor" |
+"abstract" |
+"enum" |
+"interface" |
+"transient" |
+"bridge" |
+"declared-synchronized" |
+"volatile" |
+"strictfp" |
+"varargs" |
+"native" { addToken(Token.RESERVED_WORD); }
+
+
+
+
+ /* Keywords Directives Highlight */
+".method" |
+".end method" |
+".implements" |
+".class" |
+".prologue" |
+".source" |
+".super" |
+".field" |
+".end field" |
+".registers" |
+".locals" |
+".param" |
+".line" |
+".catch" |
+".catchall" |
+".annotation" |
+".end annotation" |
+".local" |
+".end local" |
+".restart local" |
+".packed-switch" |
+".end packed-switch" |
+".array-data" |
+".end array-data" |
+".sparse-switch" |
+".end sparse-switch" |
+".end param" { addToken(Token.RESERVED_WORD_2); }
+
+
+ /* VARIABLE Register Highlight */
+{VREGISTER} |
+{PREGISTER} { addToken(Token.VARIABLE); }
+
+
+
+ /* Data types Highlight */
+{QUALIFIED_TYPE_NAME} |
+{COMPOUND_METHOD_ARG_LITERAL} |
+{MULTI_ARGS_TYPES} |
+{QUALIFIED_TYPE_NAME} |
+{VOID_TYPE} |
+{BOOLEAN_TYPE} |
+{BYTE_TYPE} |
+{SHORT_TYPE} |
+{CHAR_TYPE} |
+{INT_TYPE} |
+{LONG_TYPE} |
+{FLOAT_TYPE} |
+{DOUBLE_TYPE} { addToken(Token.DATA_TYPE); }
+
+ /* FLAGS */
+{FLAG_PSWITCH} |
+{FLAG_PSWITCH_DATA} |
+{FLAG_GOTO} |
+{FLAG_COND} |
+{FLAG_TRY_START} |
+{FLAG_TRY_END} |
+{FLAG_CATCHALL} |
+{FLAG_ARRAY} |
+{FLAG_CATCH} { addToken(Token.MARKUP_TAG_NAME); }
+
+ /* Functions */
+ /* No functions */
+
+ {BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
+
+ {LineTerminator} { addNullToken(); return firstToken; }
+
+ {Identifier} { addToken(Token.IDENTIFIER); }
+
+ {WhiteSpace} { addToken(Token.WHITESPACE); }
+
+ /* String/Character literals. */
+ {CharLiteral} { addToken(Token.LITERAL_CHAR); }
+{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
+{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
+ {StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
+{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
+{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
+
+ /* Comment literals. */
+ /* No multi-line comments */
+ /* No documentation comments */
+ {LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
+
+ /* Separators. */
+ {CustomSeparator} { addToken(Token.SEPARATOR); }
+ {Separator2} { addToken(Token.IDENTIFIER); }
+
+ /* Operators. */
+"!" |
+";" |
+"." |
+"=" |
+"/" |
+"'" |
+"(" |
+")" |
+"," |
+"->" |
+";->" |
+"<" |
+">" |
+"@" |
+"[" |
+"]" |
+"{" |
+"}" { addToken(Token.OPERATOR); }
+
+ /* Numbers */
+ {IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
+ {HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
+ {FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
+ {ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
+
+ /* Ended with a line not in a string or comment. */
+ <> { addNullToken(); return firstToken; }
+
+ /* Catch any other (unhandled) characters. */
+ . { addToken(Token.IDENTIFIER); }
+
+}
+
+
+/* No char state */
+
+/* No string state */
+
+/* No multi-line comment state */
+
+/* No documentation comment state */
+
+ {
+ [^hwf\n]+ {}
+ {URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
+ [hwf] {}
+ \n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+ <> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
+}
+
diff --git a/config/jflex/skeleton.default b/config/jflex/skeleton.default
new file mode 100644
index 0000000000000000000000000000000000000000..c8ad3fef66acdadfa9949dac6ea26c85989ac8d0
--- /dev/null
+++ b/config/jflex/skeleton.default
@@ -0,0 +1,243 @@
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** initial size of the lookahead buffer */
+--- private static final int ZZ_BUFFERSIZE = ...;
+
+ /** lexical states */
+--- lexical states, charmap
+
+ /* error codes */
+ private static final int ZZ_UNKNOWN_ERROR = 0;
+ private static final int ZZ_NO_MATCH = 1;
+ private static final int ZZ_PUSHBACK_2BIG = 2;
+
+ /* error messages for the codes above */
+ private static final String ZZ_ERROR_MSG[] = {
+ "Unkown internal scanner error",
+ "Error: could not match input",
+ "Error: pushback value was too large"
+ };
+
+--- isFinal list
+ /** the input device */
+ private java.io.Reader zzReader;
+
+ /** the current state of the DFA */
+ private int zzState;
+
+ /** the current lexical state */
+ private int zzLexicalState = YYINITIAL;
+
+ /** this buffer contains the current text to be matched and is
+ the source of the yytext() string */
+ private char zzBuffer[];
+
+ /** the textposition at the last accepting state */
+ private int zzMarkedPos;
+
+ /** the textposition at the last state to be included in yytext */
+ private int zzPushbackPos;
+
+ /** the current text position in the buffer */
+ private int zzCurrentPos;
+
+ /** startRead marks the beginning of the yytext() string in the buffer */
+ private int zzStartRead;
+
+ /** endRead marks the last character in the buffer, that has been read
+ from input */
+ private int zzEndRead;
+
+ /** number of newlines encountered up to the start of the matched text */
+ private int yyline;
+
+ /** the number of characters up to the start of the matched text */
+ private int yychar;
+
+ /**
+ * the number of characters from the last newline up to the start of the
+ * matched text
+ */
+ private int yycolumn;
+
+ /**
+ * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+ */
+ private boolean zzAtBOL = true;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+--- user class code
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+--- constructor declaration
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public final String yytext() {
+ return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+ }
+
+
+ /**
+ * Returns the character at position pos from the
+ * matched text.
+ *
+ * It is equivalent to yytext().charAt(pos), but faster
+ *
+ * @param pos the position of the character to fetch.
+ * A value from 0 to yylength()-1.
+ *
+ * @return the character at position pos
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public final int yylength() {
+ return zzMarkedPos-zzStartRead;
+ }
+
+
+ /**
+ * Reports an error that occured while scanning.
+ *
+ * In a wellformed scanner (no or only correct usage of
+ * yypushback(int) and a match-all fallback rule) this method
+ * will only be called with things that "Can't Possibly Happen".
+ * If this method is called, something is seriously wrong
+ * (e.g. a JFlex bug producing a faulty scanner etc.).
+ *
+ * Usual syntax/scanner level error handling should be done
+ * in error fallback rules.
+ *
+ * @param errorCode the code of the errormessage to display
+ */
+--- zzScanError declaration
+ String message;
+ try {
+ message = ZZ_ERROR_MSG[errorCode];
+ }
+ catch (ArrayIndexOutOfBoundsException e) {
+ message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+ }
+
+--- throws clause
+ }
+
+
+ /**
+ * Pushes the specified amount of characters back into the input stream.
+ *
+ * They will be read again by then next call of the scanning method
+ *
+ * @param number the number of characters to be read again.
+ * This number must not be greater than yylength()!
+ */
+--- yypushback decl (contains zzScanError exception)
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+--- zzDoEOF
+ /**
+ * Resumes scanning until the next regular expression is matched,
+ * the end of input is encountered or an I/O-Error occurs.
+ *
+ * @return the next token
+ * @exception java.io.IOException if any I/O-Error occurs
+ */
+--- yylex declaration
+ int zzInput;
+ int zzAction;
+
+ // cached fields:
+ int zzCurrentPosL;
+ int zzMarkedPosL;
+ int zzEndReadL = zzEndRead;
+ char [] zzBufferL = zzBuffer;
+ char [] zzCMapL = ZZ_CMAP;
+
+--- local declarations
+
+ while (true) {
+ zzMarkedPosL = zzMarkedPos;
+
+--- start admin (line, char, col count)
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+--- start admin (lexstate etc)
+
+ zzForAction: {
+ while (true) {
+
+--- next input, line, col, char count, next transition, isFinal action
+ zzAction = zzState;
+ zzMarkedPosL = zzCurrentPosL;
+--- line count update
+ }
+
+ }
+ }
+
+ // store back cached position
+ zzMarkedPos = zzMarkedPosL;
+--- char count update
+
+--- actions
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+--- eofvalue
+ }
+ else {
+--- no match
+ }
+ }
+ }
+ }
+
+--- main
+
+}
diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java
index 151bc3e5002349654f97decdd607cafc8ea4acd7..584b54a21d800d6caf94555a3b464da1a1791544 100644
--- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java
+++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/ClassCodeContentPanel.java
@@ -6,6 +6,9 @@ import java.awt.Point;
import javax.swing.JTabbedPane;
import javax.swing.border.EmptyBorder;
+import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory;
+import org.fife.ui.rsyntaxtextarea.TokenMakerFactory;
+
import jadx.gui.treemodel.JNode;
import jadx.gui.ui.TabbedPane;
import jadx.gui.ui.panel.IViewStateSupport;
@@ -29,6 +32,10 @@ public final class ClassCodeContentPanel extends AbstractCodeContentPanel implem
public ClassCodeContentPanel(TabbedPane panel, JNode jnode) {
super(panel, jnode);
+ // FIXME I don't know the project very well, so need to get the right place
+ AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance();
+ atmf.putMapping("text/smali", "jadx.gui.ui.codearea.SmaliTokenMaker");
+
javaCodePanel = new CodePanel(new CodeArea(this));
smaliCodePanel = new CodePanel(new SmaliArea(this));
diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java
index 6fbbde0340725ffefe1a9c0423eb62dfee93f9ad..e320f83670d852c8ef1ce0c3cf1e1c8922ee0eba 100644
--- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java
+++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliArea.java
@@ -162,7 +162,7 @@ public final class SmaliArea extends AbstractCodeArea {
public NormalModel() {
Theme theme = getContentPanel().getTabbedPane().getMainWindow().getEditorTheme();
setSyntaxScheme(theme.scheme);
- setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA);
+ setSyntaxEditingStyle("text/smali");
}
@Override
diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliTokenMaker.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliTokenMaker.java
new file mode 100644
index 0000000000000000000000000000000000000000..b52ac88c9787c03567f90a015b08cd3e172ac361
--- /dev/null
+++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/SmaliTokenMaker.java
@@ -0,0 +1,1678 @@
+/* The following code was generated by JFlex */
+
+package jadx.gui.ui.codearea;
+
+import java.io.*;
+
+import javax.swing.text.Segment;
+
+import org.fife.ui.rsyntaxtextarea.*;
+
+/**
+ * 用于Smali代码高亮
+ * MartinKay@qq.com
+ */
+
+@SuppressWarnings("checkstyle:all")
+public class SmaliTokenMaker extends AbstractJFlexCTokenMaker {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** initial size of the lookahead buffer */
+ private static final int ZZ_BUFFERSIZE = 16384;
+
+ /** lexical states */
+ public static final int EOL_COMMENT = 1;
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\21\1\10\1\0\1\21\1\17\22\0\1\77\1\54\1\15" +
+ "\1\20\1\1\1\35\1\35\1\7\1\37\1\37\1\35\1\40\1\35" +
+ "\1\25\1\23\1\41\1\4\1\66\1\16\1\72\1\71\1\6\1\67" +
+ "\1\6\1\76\1\3\1\45\1\50\1\55\1\54\1\56\1\35\1\36" +
+ "\1\5\1\53\1\53\1\53\1\5\1\53\2\1\1\52\1\52\1\1" +
+ "\1\47\6\1\1\52\2\1\1\51\3\1\1\52\1\37\1\11\1\37" +
+ "\1\17\1\2\1\0\1\31\1\14\1\60\1\61\1\24\1\30\1\62" +
+ "\1\42\1\44\1\70\1\73\1\32\1\65\1\13\1\63\1\43\1\74" +
+ "\1\27\1\33\1\26\1\12\1\57\1\46\1\22\1\64\1\75\1\34" +
+ "\1\17\1\34\1\35\uff81\0";
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+ /**
+ * Translates DFA states to action switch labels.
+ */
+ private static final int[] ZZ_ACTION = zzUnpackAction();
+
+ private static final String ZZ_ACTION_PACKED_0 =
+ "\2\0\2\1\2\2\1\3\1\4\3\1\1\5\1\6" +
+ "\1\7\12\1\1\10\1\11\1\12\4\1\2\13\1\12" +
+ "\5\1\1\14\1\15\3\14\1\0\1\16\1\0\2\16" +
+ "\1\3\1\17\1\0\1\3\5\1\2\5\1\20\1\21" +
+ "\12\0\1\1\1\10\23\1\1\12\5\1\6\0\1\13" +
+ "\1\0\15\1\5\0\1\21\1\0\1\22\1\3\1\23" +
+ "\2\3\1\17\1\3\5\1\1\24\1\1\1\5\1\25" +
+ "\1\5\20\0\35\1\7\0\10\1\1\0\2\1\5\0" +
+ "\1\3\2\0\1\1\1\0\1\1\1\5\22\0\1\26" +
+ "\1\27\3\1\1\0\7\1\1\24\1\1\1\0\2\1" +
+ "\1\0\6\1\1\0\2\1\11\0\4\1\1\0\3\1" +
+ "\1\24\2\0\1\1\1\24\2\0\1\30\1\0\1\3" +
+ "\6\0\1\1\1\5\6\0\1\31\13\0\2\1\3\0" +
+ "\2\1\1\0\3\1\3\0\2\1\1\0\6\1\1\0" +
+ "\2\1\1\24\5\0\3\1\1\24\1\0\2\1\3\0" +
+ "\1\1\5\0\1\3\6\0\1\5\7\0\1\31\4\0" +
+ "\1\31\1\1\1\24\4\0\1\1\1\0\2\1\10\0" +
+ "\1\1\1\0\3\1\1\0\2\1\1\24\3\0\1\32" +
+ "\2\1\2\0\1\1\1\0\2\1\3\0\1\24\1\1" +
+ "\23\0\1\1\7\0\2\1\10\0\1\24\1\1\1\24" +
+ "\1\0\2\1\1\0\1\1\11\0\1\1\1\0\1\1" +
+ "\2\0\1\1\22\0\1\24\3\0\1\1\12\0\1\1" +
+ "\1\0\1\1\15\0\1\1\1\0\1\1\25\0\1\1" +
+ "\22\0\1\1\10\0\1\24\26\0\1\24\2\0\1\1" +
+ "\35\0\1\24\3\0\1\24\6\0\1\24\50\0\1\26";
+
+ private static int[] zzUnpackAction() {
+ int[] result = new int[701];
+ int offset = 0;
+ offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackAction(String packed, int offset, int[] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ do
+ result[j++] = value;
+ while (--count > 0);
+ }
+ return j;
+ }
+
+ /**
+ * Translates a state to a row index in the transition table
+ */
+ private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
+
+ private static final String ZZ_ROWMAP_PACKED_0 =
+ "\0\0\0\100\0\200\0\300\0\u0100\0\u0140\0\u0180\0\200" +
+ "\0\u01c0\0\u0200\0\u0240\0\u0280\0\200\0\u02c0\0\u0300\0\u0340" +
+ "\0\u0380\0\u03c0\0\u0400\0\u0440\0\u0480\0\u04c0\0\u0500\0\u0540" +
+ "\0\200\0\200\0\u0580\0\u05c0\0\u0600\0\u0640\0\u0680\0\300" +
+ "\0\u06c0\0\u0700\0\u0740\0\u0780\0\u07c0\0\u0800\0\u0840\0\u0880" +
+ "\0\200\0\u08c0\0\u0900\0\u0940\0\u0980\0\u09c0\0\u0a00\0\u0a40" +
+ "\0\u0a80\0\u0ac0\0\200\0\u0b00\0\u0b40\0\u0b80\0\u0bc0\0\u0c00" +
+ "\0\u0c40\0\u0c80\0\u0cc0\0\u0d00\0\200\0\u0d40\0\u0d80\0\u0dc0" +
+ "\0\u0e00\0\u0e40\0\u0e80\0\u0ec0\0\u0f00\0\u0f40\0\u0f80\0\u0fc0" +
+ "\0\u1000\0\u1040\0\u1080\0\u10c0\0\u1100\0\u1140\0\u1180\0\u11c0" +
+ "\0\u1200\0\u1240\0\u1280\0\u12c0\0\u1300\0\u1340\0\u1380\0\u13c0" +
+ "\0\u1400\0\u1440\0\u1480\0\u14c0\0\u1500\0\u1540\0\u1580\0\u15c0" +
+ "\0\u1600\0\u1640\0\u1680\0\u16c0\0\u1700\0\u1740\0\u1780\0\u17c0" +
+ "\0\u1800\0\200\0\u1840\0\u06c0\0\u1880\0\u18c0\0\u1900\0\u1940" +
+ "\0\u1980\0\u19c0\0\u1a00\0\u1a40\0\u1a80\0\u1ac0\0\u1b00\0\u1b40" +
+ "\0\u1b80\0\u1bc0\0\u1c00\0\u1c40\0\u1c80\0\u1cc0\0\u1d00\0\u0a80" +
+ "\0\u1d40\0\200\0\u1d80\0\u1dc0\0\u0b00\0\u1e00\0\u1e40\0\u1e80" +
+ "\0\u1ec0\0\u1f00\0\u1f40\0\300\0\u1f80\0\u1fc0\0\200\0\u2000" +
+ "\0\u2040\0\u2080\0\u20c0\0\u2100\0\u2140\0\u2180\0\u21c0\0\u2200" +
+ "\0\u2240\0\u2280\0\u22c0\0\u2300\0\u2340\0\u2380\0\u23c0\0\u2400" +
+ "\0\u2440\0\u2480\0\u24c0\0\u2500\0\u2540\0\u2580\0\u25c0\0\u2600" +
+ "\0\u2640\0\u2680\0\u26c0\0\u2700\0\u2740\0\u2780\0\u27c0\0\u2800" +
+ "\0\u2840\0\u2880\0\u28c0\0\u2900\0\u2940\0\u2980\0\u29c0\0\u2a00" +
+ "\0\u2a40\0\u2a80\0\u2ac0\0\u2b00\0\u2b40\0\u2b80\0\u2bc0\0\u2c00" +
+ "\0\u2c40\0\u2c80\0\u2cc0\0\u2d00\0\u2d40\0\u2d80\0\u2dc0\0\u2e00" +
+ "\0\u2e40\0\u2e80\0\u2ec0\0\u2f00\0\u2f40\0\u2f80\0\u2fc0\0\u3000" +
+ "\0\u3040\0\u3080\0\u30c0\0\u3100\0\u3140\0\u3180\0\u31c0\0\u3200" +
+ "\0\u3240\0\u3280\0\u32c0\0\u3300\0\u3340\0\u3380\0\u33c0\0\u3400" +
+ "\0\u3440\0\u3480\0\u34c0\0\u3500\0\u3540\0\u3580\0\u35c0\0\u3600" +
+ "\0\u3640\0\u3680\0\u36c0\0\u3700\0\u3740\0\300\0\300\0\u3780" +
+ "\0\u37c0\0\u3800\0\u3840\0\u3880\0\u38c0\0\u3900\0\u3940\0\u3980" +
+ "\0\u39c0\0\u3a00\0\u3a40\0\u3a80\0\u3ac0\0\u3b00\0\u3b40\0\u3b80" +
+ "\0\u3bc0\0\u3c00\0\u3c40\0\u3c80\0\u3cc0\0\u3d00\0\u3d40\0\u3d80" +
+ "\0\u3dc0\0\u3e00\0\u3e40\0\u3e80\0\u3ec0\0\u3f00\0\u3f40\0\u3f80" +
+ "\0\u3fc0\0\u4000\0\u4040\0\u4080\0\u40c0\0\u4100\0\u4140\0\u4180" +
+ "\0\u41c0\0\u4200\0\u4240\0\u4280\0\u42c0\0\u4300\0\u4340\0\u4380" +
+ "\0\u43c0\0\u4400\0\u4440\0\u4480\0\u44c0\0\u4500\0\u4540\0\u4580" +
+ "\0\u45c0\0\u4600\0\u4640\0\u4680\0\u46c0\0\u4700\0\u4740\0\u4780" +
+ "\0\u47c0\0\u4800\0\200\0\u4840\0\u4880\0\u48c0\0\u4900\0\u4940" +
+ "\0\u4980\0\u49c0\0\u4a00\0\u4a40\0\u4a80\0\u4ac0\0\u4b00\0\u4b40" +
+ "\0\u4b80\0\u4bc0\0\u4c00\0\u4c40\0\u4c80\0\u4cc0\0\u4d00\0\u4d40" +
+ "\0\u4d80\0\u4dc0\0\u4e00\0\u4e40\0\u4e80\0\u4ec0\0\u4f00\0\u4f40" +
+ "\0\u4f80\0\u4fc0\0\u5000\0\u5040\0\u5080\0\u50c0\0\u5100\0\u5140" +
+ "\0\u5180\0\u51c0\0\u5200\0\u5240\0\u5280\0\u52c0\0\u5300\0\u5340" +
+ "\0\u5380\0\u53c0\0\u5400\0\u5440\0\u5480\0\u54c0\0\u5500\0\u5540" +
+ "\0\u5580\0\u55c0\0\u5600\0\u5640\0\u4400\0\u5680\0\u56c0\0\u5700" +
+ "\0\u5740\0\u5780\0\u57c0\0\u5800\0\u5840\0\u5880\0\u58c0\0\u5900" +
+ "\0\u5940\0\u5980\0\u59c0\0\u5a00\0\u5a40\0\u4a80\0\u5a80\0\u5ac0" +
+ "\0\u5b00\0\u5b40\0\u5b80\0\u5bc0\0\u5c00\0\u5c40\0\u5c80\0\u5cc0" +
+ "\0\u5d00\0\u5d40\0\u5d80\0\u5dc0\0\u5e00\0\u5e40\0\u5e80\0\u5ec0" +
+ "\0\u5f00\0\u5f40\0\u5f80\0\u5fc0\0\u6000\0\u6040\0\u6080\0\u60c0" +
+ "\0\u6100\0\u6140\0\u6180\0\u61c0\0\u6200\0\200\0\u6240\0\u6280" +
+ "\0\u62c0\0\u6300\0\u6340\0\u6380\0\u63c0\0\u6400\0\u6440\0\u6480" +
+ "\0\u64c0\0\u6500\0\u6540\0\u6580\0\u65c0\0\u6600\0\u6640\0\u6680" +
+ "\0\u66c0\0\u6700\0\u6740\0\u6780\0\u67c0\0\u6800\0\u6840\0\u6880" +
+ "\0\u68c0\0\u6900\0\u6940\0\u6980\0\u69c0\0\u6a00\0\u6a40\0\u6a80" +
+ "\0\u6ac0\0\u6b00\0\u6b40\0\u6b80\0\u6bc0\0\u6c00\0\u6c40\0\u6c80" +
+ "\0\u6cc0\0\u6d00\0\u6d40\0\u6d80\0\u6dc0\0\u6e00\0\u6e40\0\u6e80" +
+ "\0\u6ec0\0\u6f00\0\u6f40\0\u6f80\0\u6fc0\0\u7000\0\u7040\0\u7080" +
+ "\0\u70c0\0\u7100\0\u7140\0\u7180\0\u71c0\0\u7200\0\u7240\0\u7280" +
+ "\0\u72c0\0\u7300\0\u7340\0\u7380\0\u73c0\0\u7400\0\u7440\0\u7480" +
+ "\0\u74c0\0\u7500\0\u7540\0\u7580\0\u75c0\0\u7600\0\u7640\0\u7680" +
+ "\0\u76c0\0\u7700\0\u7740\0\u7780\0\u77c0\0\u7800\0\u7840\0\u7880" +
+ "\0\u78c0\0\u7900\0\u7940\0\u7980\0\u79c0\0\u7a00\0\u7a40\0\u7a80" +
+ "\0\u7ac0\0\u7b00\0\u7b40\0\u7b80\0\u7bc0\0\u7c00\0\u7c40\0\u7c80" +
+ "\0\u7cc0\0\u7d00\0\u7d40\0\u7d80\0\u7dc0\0\u7e00\0\u7e40\0\u7e80" +
+ "\0\u7ec0\0\u7f00\0\u7f40\0\u7f80\0\u7fc0\0\u8000\0\u8040\0\u8080" +
+ "\0\u80c0\0\u8100\0\u8140\0\u8180\0\u81c0\0\u8200\0\u8240\0\u8280" +
+ "\0\u82c0\0\u8300\0\u8340\0\u8380\0\u83c0\0\u8400\0\u8440\0\u8480" +
+ "\0\u84c0\0\u8500\0\u8540\0\u8580\0\u85c0\0\u8600\0\u8640\0\u8680" +
+ "\0\u86c0\0\u8700\0\u8740\0\u8780\0\u87c0\0\u8800\0\u8840\0\u8880" +
+ "\0\u88c0\0\u8900\0\u8940\0\u8980\0\u89c0\0\u8a00\0\u8a40\0\u8a80" +
+ "\0\u8ac0\0\u8b00\0\u8b40\0\u8b80\0\u8bc0\0\u8c00\0\u8c40\0\u8c80" +
+ "\0\u8cc0\0\u8d00\0\u8d40\0\u8d80\0\u8dc0\0\u8e00\0\u8e40\0\u8e80" +
+ "\0\u8ec0\0\u8f00\0\u8f40\0\u8f80\0\u8fc0\0\u9000\0\u9040\0\u9080" +
+ "\0\u90c0\0\u9100\0\u9140\0\u9180\0\u91c0\0\u9200\0\u9240\0\u9280" +
+ "\0\u92c0\0\u9300\0\u9340\0\u9380\0\u93c0\0\u9400\0\u9440\0\u9480" +
+ "\0\u94c0\0\u9500\0\u9540\0\u9580\0\u95c0\0\u9600\0\u9640\0\u9680" +
+ "\0\u96c0\0\u9700\0\u9740\0\u9780\0\u97c0\0\u9800\0\u9840\0\u9880" +
+ "\0\u98c0\0\u9900\0\u9940\0\u9980\0\u99c0\0\u9a00\0\u9a40\0\u9a80" +
+ "\0\u9ac0\0\u9b00\0\u9b40\0\u9b80\0\u9bc0\0\u9c00\0\u9c40\0\u9c80" +
+ "\0\u9cc0\0\u9d00\0\u9d40\0\u9d80\0\u9dc0\0\u9e00\0\u9e40\0\u9e80" +
+ "\0\u9ec0\0\u9f00\0\u9f40\0\u9f80\0\u9fc0\0\ua000\0\ua040\0\ua080" +
+ "\0\ua0c0\0\ua100\0\ua140\0\ua180\0\ua1c0\0\ua200\0\ua240\0\ua280" +
+ "\0\ua2c0\0\ua300\0\ua340\0\ua380\0\ua3c0\0\ua400\0\ua440\0\ua480" +
+ "\0\ua4c0\0\ua500\0\ua540\0\ua580\0\ua5c0\0\ua600\0\ua640\0\ua680" +
+ "\0\ua6c0\0\ua700\0\ua740\0\ua780\0\ua7c0\0\ua800\0\ua840\0\ua880" +
+ "\0\ua8c0\0\ua900\0\ua940\0\ua980\0\200";
+
+ private static int[] zzUnpackRowMap() {
+ int[] result = new int[701];
+ int offset = 0;
+ offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackRowMap(String packed, int offset, int[] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int high = packed.charAt(i++) << 16;
+ result[j++] = high | packed.charAt(i++);
+ }
+ return j;
+ }
+
+ /**
+ * The transition table of the DFA
+ */
+ private static final int[] ZZ_TRANS = zzUnpackTrans();
+
+ private static final String ZZ_TRANS_PACKED_0 =
+ "\1\3\2\4\1\5\1\6\1\4\1\5\1\7\1\10" +
+ "\1\3\1\11\1\12\1\13\1\14\1\5\1\3\1\15" +
+ "\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25" +
+ "\1\26\1\27\1\30\1\31\1\3\1\32\1\31\1\3" +
+ "\1\32\1\4\1\33\1\34\1\35\1\4\1\36\1\37" +
+ "\1\40\2\41\3\32\1\42\1\43\1\44\1\45\1\46" +
+ "\1\4\1\47\2\5\1\4\2\5\3\4\1\5\1\16" +
+ "\10\50\1\51\17\50\1\52\11\50\1\53\3\50\1\54" +
+ "\31\50\101\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\1\0\3\56" +
+ "\2\5\1\56\1\5\2\0\4\56\1\0\1\5\1\0" +
+ "\1\56\1\0\1\56\1\57\1\60\1\0\6\56\2\0" +
+ "\1\56\3\0\3\56\1\0\2\56\1\0\3\56\3\0" +
+ "\7\56\2\5\1\56\2\5\3\56\1\5\1\0\3\56" +
+ "\2\5\1\56\1\5\2\0\4\56\1\0\1\5\1\0" +
+ "\1\56\1\0\1\61\1\57\1\60\1\0\6\56\2\0" +
+ "\1\56\3\0\3\56\1\0\2\56\1\0\3\56\3\0" +
+ "\7\56\2\5\1\56\2\5\3\56\1\5\1\0\7\62" +
+ "\1\63\1\64\1\65\66\62\1\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\5\4\1\66\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\67\1\0\3\4\1\70" +
+ "\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\4\4\1\71\13\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\4" +
+ "\1\72\4\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\1\0\10\14\1\73\1\74\3\14\1\75" +
+ "\62\14\21\0\1\16\55\0\1\16\1\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\4\4\1\46\13\4\4\0\2\76\1\0\1\76" +
+ "\7\0\1\76\5\0\1\77\2\0\1\100\1\101\1\102" +
+ "\1\103\1\104\7\0\1\105\1\106\13\0\1\107\4\0" +
+ "\1\110\2\76\1\0\2\76\3\0\1\76\2\0\6\4" +
+ "\2\0\1\55\1\4\1\111\1\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\57\0\1\112\22\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\1\4\1\113\4\4\6\0\1\114" +
+ "\2\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\115\1\0\5\4\1\116\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\3\4\1\117\1\120\1\4\6\0\2\4\1\121" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\1\4\1\122\1\123\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\1\4\1\124\4\4\6\0" +
+ "\1\4\1\125\1\4\1\0\2\4\1\0\3\4\3\0" +
+ "\2\4\1\126\1\127\14\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\4\4\1\130\13\4\2\0\6\4\2\0\1\55\1\131" +
+ "\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\1\132\5\4\6\0\1\133\1\134\1\4\1\0\2\4" +
+ "\1\0\3\4\3\0\3\4\1\127\1\4\1\135\12\4" +
+ "\2\0\2\4\2\136\1\4\1\136\2\0\1\55\1\137" +
+ "\2\4\1\0\1\136\3\0\1\4\1\0\1\4\1\0" +
+ "\1\4\1\140\1\4\1\141\2\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\7\4\2\136\1\4\2\136" +
+ "\3\4\1\136\2\0\6\4\2\0\1\55\1\4\1\142" +
+ "\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\2\4\1\143\3\4\6\0\1\4\1\125\1\4\1\0" +
+ "\2\4\1\0\3\4\3\0\3\4\1\127\14\4\27\0" +
+ "\1\144\2\0\1\145\11\0\1\146\14\0\1\147\1\0" +
+ "\1\150\16\0\6\36\2\0\1\55\3\36\1\0\1\36" +
+ "\3\0\1\36\1\0\1\36\1\0\6\36\5\0\1\151" +
+ "\3\36\1\0\2\36\1\152\3\36\3\0\20\36\26\0" +
+ "\1\153\53\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\1\4\1\36\1\152\1\4\2\154\3\0\20\4" +
+ "\2\0\2\4\2\136\1\4\1\136\2\0\1\55\3\4" +
+ "\1\0\1\136\3\0\1\4\1\0\1\4\1\0\3\4" +
+ "\1\155\2\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\4\4\1\156\2\4\2\136\1\4\2\136\3\4" +
+ "\1\136\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\1\157" +
+ "\2\4\1\0\2\4\1\0\3\4\3\0\4\4\1\160" +
+ "\1\4\1\161\11\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\162\1\0\6\4" +
+ "\6\0\2\4\1\163\1\0\2\4\1\0\3\4\3\0" +
+ "\4\4\1\164\13\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\4\4" +
+ "\1\165\13\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\1\4\1\166" +
+ "\4\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\1\167\2\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\4\4\1\170" +
+ "\13\4\1\0\10\50\1\0\17\50\1\0\11\50\1\0" +
+ "\3\50\1\0\31\50\26\0\1\171\15\0\1\172\61\0" +
+ "\1\173\117\0\1\174\43\0\1\175\65\0\7\56\2\0" +
+ "\4\56\1\0\1\56\1\0\1\56\1\0\1\56\1\0" +
+ "\1\56\1\0\6\56\2\0\1\56\3\0\3\56\1\0" +
+ "\2\56\1\0\3\56\3\0\20\56\4\0\2\76\1\0" +
+ "\1\76\7\0\1\76\47\0\2\76\1\0\2\76\3\0" +
+ "\1\76\1\0\3\56\2\176\1\56\1\176\2\0\4\56" +
+ "\1\0\1\176\1\0\1\56\1\0\1\56\1\0\1\56" +
+ "\1\177\6\56\2\0\1\56\1\0\1\177\1\0\3\56" +
+ "\1\0\2\56\1\0\3\56\3\0\7\56\2\176\1\56" +
+ "\2\176\3\56\1\176\1\0\3\56\4\200\2\0\3\56" +
+ "\1\200\1\0\1\200\1\0\1\56\1\0\1\56\1\0" +
+ "\1\200\1\0\2\56\2\200\2\56\2\0\1\56\3\0" +
+ "\3\56\1\0\2\56\1\0\2\56\1\200\3\0\1\56" +
+ "\2\200\4\56\2\200\1\56\2\200\3\56\1\200\1\0" +
+ "\7\201\1\202\1\0\67\201\7\0\1\202\70\0\4\201" +
+ "\1\203\1\201\1\204\1\205\1\0\1\62\1\206\3\62" +
+ "\1\203\7\201\3\62\35\201\1\203\1\204\1\201\1\204" +
+ "\1\203\5\201\1\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\1\207\2\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\1\210\1\4\1\0\3\4\3\0\3\4\1\211\14\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\1\212\5\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\213\5\4\6\0\1\4\1\214\1\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\2\4\1\215\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\1\0\11\73\1\216\3\73" +
+ "\1\217\66\73\1\14\1\73\2\14\1\0\1\14\1\220" +
+ "\4\14\7\73\3\14\35\73\2\14\1\73\2\14\5\73" +
+ "\3\56\2\76\1\56\1\76\2\0\4\56\1\0\1\76" +
+ "\1\0\1\56\1\0\1\56\1\0\1\60\1\0\6\56" +
+ "\2\0\1\56\3\0\3\56\1\0\2\56\1\0\3\56" +
+ "\3\0\7\56\2\76\1\56\2\76\3\56\1\76\14\0" +
+ "\1\221\110\0\1\222\117\0\1\223\46\0\1\224\13\0" +
+ "\1\225\114\0\1\226\16\0\1\227\26\0\1\230\30\0" +
+ "\1\231\17\0\1\232\43\0\1\233\1\0\1\234\133\0" +
+ "\1\235\43\0\1\236\1\237\71\0\1\240\54\0\6\4" +
+ "\2\0\1\55\1\241\2\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\2\112\2\0\1\112" +
+ "\4\0\3\112\5\0\1\112\1\0\1\112\1\0\6\112" +
+ "\6\0\3\112\1\0\2\112\1\0\3\112\1\0\11\112" +
+ "\2\0\1\112\2\0\3\112\3\0\6\4\2\0\1\55" +
+ "\1\242\2\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\3\4\1\243\2\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\1\4\1\244\4\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\245" +
+ "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\6\4\1\246\11\4\2\0\6\4\2\0\1\55\1\247" +
+ "\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\4\4\1\250\1\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\4\4\1\251\13\4\2\0" +
+ "\6\4\2\0\1\55\1\4\1\252\1\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\4\4\1\253\1\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\1\4\1\254\1\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\2\4\1\166" +
+ "\15\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\5\4\1\255\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\1\4\1\256\4\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\1\257\2\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\2\4\1\246\15\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\257\1\0\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\1\4\1\260\1\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\2\4\1\261\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\1\4\1\262\1\4\1\263\2\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\4\1\264\2\4\1\264\1\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\1\257\2\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\3\4\1\265\2\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\1\4\1\266\1\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\2\4" +
+ "\2\136\1\4\1\136\2\0\1\55\3\4\1\0\1\136" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\7\4\2\136\1\4" +
+ "\2\136\3\4\1\136\2\0\6\4\2\0\1\55\2\4" +
+ "\1\267\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\2\4" +
+ "\1\270\1\0\2\4\1\0\3\4\3\0\4\4\1\271" +
+ "\13\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\1\4\1\272\16\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\1\273\4\4\1\274\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\1\275\17\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\276\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\30\0\1\277\77\0" +
+ "\1\300\103\0\1\301\75\0\1\302\31\0\1\303\77\0" +
+ "\1\304\15\0\6\151\3\0\3\151\1\0\1\151\3\0" +
+ "\1\151\1\0\1\151\1\0\6\151\5\0\4\151\1\0" +
+ "\2\151\1\152\3\151\3\0\20\151\57\0\1\32\22\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\1\4\1\305\4\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\4\4\1\306\1\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\307" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\1\4\1\310" +
+ "\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\1\4" +
+ "\1\311\1\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\1\4\1\312\16\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\1\246\17\4\2\0\6\4\2\0" +
+ "\1\55\1\313\2\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\314" +
+ "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\315\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\4\4\1\246\1\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\1\4\1\316\1\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\1\317\17\4\44\0\1\320\66\0" +
+ "\1\321\73\0\1\322\117\0\1\323\34\0\4\324\5\0" +
+ "\1\324\1\0\1\324\5\0\1\324\3\0\2\324\21\0" +
+ "\1\324\4\0\2\324\4\0\2\324\1\0\2\324\3\0" +
+ "\1\324\1\0\3\56\2\176\1\56\1\176\2\0\4\56" +
+ "\1\0\1\176\1\0\1\56\1\0\1\56\1\0\1\56" +
+ "\1\0\6\56\2\0\1\56\3\0\3\56\1\0\2\56" +
+ "\1\0\3\56\3\0\7\56\2\176\1\56\2\176\3\56" +
+ "\1\176\4\0\2\176\1\0\1\176\7\0\1\176\47\0" +
+ "\2\176\1\0\2\176\3\0\1\176\1\0\7\201\1\63" +
+ "\1\0\73\201\1\204\1\201\1\204\1\202\1\0\5\201" +
+ "\1\204\47\201\2\204\1\201\2\204\11\201\1\62\1\201" +
+ "\1\62\1\202\1\0\5\201\1\62\47\201\2\62\1\201" +
+ "\2\62\10\201\4\325\1\63\1\0\3\201\1\325\1\201" +
+ "\1\325\5\201\1\325\3\201\2\325\21\201\1\325\4\201" +
+ "\2\325\4\201\2\325\1\201\2\325\3\201\1\325\1\201" +
+ "\1\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\1\4\1\264\4\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\326\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\327" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\2\4" +
+ "\1\330\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\331\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\2\4\1\332\15\4\1\0\10\73\1\0\72\73\4\333" +
+ "\2\73\1\216\2\73\1\333\1\217\1\333\5\73\1\333" +
+ "\3\73\2\333\21\73\1\333\4\73\2\333\4\73\2\333" +
+ "\1\73\2\333\3\73\1\333\1\73\61\0\1\334\51\0" +
+ "\1\335\26\0\1\336\41\0\1\337\66\0\1\340\113\0" +
+ "\1\341\63\0\1\342\144\0\1\343\62\0\1\344\65\0" +
+ "\1\345\60\0\1\346\150\0\1\347\43\0\1\350\30\0" +
+ "\1\351\62\0\1\352\62\0\1\353\102\0\1\354\74\0" +
+ "\1\355\52\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\6\4\1\356\11\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\357\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\1\4\1\360\1\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\4\4\1\361\13\4\2\0\6\4\2\0\1\55\1\362" +
+ "\2\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\363\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\2\4\1\364\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\5\4\1\242\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\3\4\1\365" +
+ "\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\3\4\1\366\2\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\4\4\1\367\1\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\4\4\1\370\13\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\371\5\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\3\4\1\372\2\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\373" +
+ "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\3\4\1\374\14\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\375\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\2\4\1\376\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\377" +
+ "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\u0100\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\4\1\u0101\4\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\1\u0102\5\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\4\4" +
+ "\1\377\1\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\1\u0103\17\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\1\u0104\5\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\14\4\1\u0105\3\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u0106" +
+ "\1\u0107\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\1\u0108\5\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\4\4\1\u0109\13\4\14\0" +
+ "\1\u010a\10\0\1\u010b\5\0\1\u010c\27\0\1\u010c\101\0" +
+ "\1\u010d\42\0\1\u010e\116\0\1\u010f\57\0\1\u0110\64\0" +
+ "\1\u0111\112\0\1\u0112\52\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\3\4" +
+ "\1\u0113\2\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\3\4\1\u0114" +
+ "\2\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\1\4\1\u0115\16\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\5\4\1\u0116\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\u0117\4\4\1\u0118\1\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\3\4\1\u0118\14\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\4\4\1\u0119\1\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\2\4\1\u011a\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\4\4\1\u011b\13\4\33\0\1\u011c\11\0\1\u011d\34\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\2\4\1\u011e\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u011f" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\46\0\1\u0120\56\0\1\320\116\0\1\u0121" +
+ "\57\0\1\u0122\57\0\4\u0123\5\0\1\u0123\1\0\1\u0123" +
+ "\5\0\1\u0123\3\0\2\u0123\21\0\1\u0123\4\0\2\u0123" +
+ "\4\0\2\u0123\1\0\2\u0123\3\0\1\u0123\1\0\3\201" +
+ "\4\u0124\1\63\1\0\3\201\1\u0124\1\201\1\u0124\5\201" +
+ "\1\u0124\3\201\2\u0124\21\201\1\u0124\4\201\2\u0124\4\201" +
+ "\2\u0124\1\201\2\u0124\3\201\1\u0124\1\201\31\0\1\u0125" +
+ "\12\0\1\u0126\63\0\1\u0127\1\0\1\u0128\11\0\1\u0129" +
+ "\14\0\1\u012a\17\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\1\u012b\17\4" +
+ "\33\0\1\u0128\11\0\1\u0129\34\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\3\4\1\u012b\14\4\1\0\3\73\4\u012c\2\73\1\216" +
+ "\2\73\1\u012c\1\217\1\u012c\5\73\1\u012c\3\73\2\u012c" +
+ "\21\73\1\u012c\4\73\2\u012c\4\73\2\u012c\1\73\2\u012c" +
+ "\3\73\1\u012c\1\73\77\0\1\u012d\26\0\1\u012e\115\0" +
+ "\1\u012f\65\0\1\u0130\130\0\1\u0131\45\0\1\u0132\72\0" +
+ "\1\u0133\104\0\1\u0134\72\0\1\u0135\102\0\1\u0136\77\0" +
+ "\1\u0137\102\0\1\u0138\76\0\1\u0139\141\0\1\u013a\36\0" +
+ "\1\u013b\125\0\1\u013c\52\0\1\u013d\106\0\1\u013e\36\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\5\4\1\u013f\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\3\4\1\0\1\214\1\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\4" +
+ "\1\u0140\4\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\31\0\1\u0141\1\0\1\u011c\11\0\1\u011d" +
+ "\14\0\1\u0142\17\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\u0143\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\1\u0144\5\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\4\4\1\356\1\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\u0145\1\u0146" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\1\u0147\5\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\1\4\1\u0148\4\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\5\4\1\u0149\12\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\u014a\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\u014b\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\31\0" +
+ "\1\u0141\1\0\1\u011c\11\0\1\u014c\14\0\1\u0142\17\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\1\4\1\u014d\16\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\2\4\1\u014e\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\33\0\1\u011c\11\0\1\u014f" +
+ "\34\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\5\4\1\u0150\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\2\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\1\u0151\2\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\3\4\1\u0152\2\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\u0153\1\0\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\u0154\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\1\4\1\u0155\4\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\27\0\1\u0156\52\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\3\4\1\u0157\2\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\14\4\1\u0158\3\4\25\0\1\u0159\147\0\1\u0159" +
+ "\27\0\1\u0159\1\0\1\u0159\53\0\1\u015a\126\0\1\u015b" +
+ "\112\0\1\u015c\113\0\1\u015d\100\0\1\u015e\101\0\1\u015e" +
+ "\15\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\1\4\1\u015f\4\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\1\u0160\5\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\14\4\1\u0161\3\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\1\u0162\5\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\33\0\1\u0128\46\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\u0163" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\3\4\1\u0164\2\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\4\4\1\u0165\1\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\6\4\5\0\1\u0166\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\64\0\1\u0167\27\0" +
+ "\1\u0168\65\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\1\u0169\5\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\u016a\6\4\5\0\1\u016b\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\42\0\1\u016c\71\0" +
+ "\1\320\11\0\1\u0120\33\0\1\u0122\1\u016d\4\u0122\1\u016d" +
+ "\2\0\3\u0122\1\0\1\u0122\1\0\1\u016d\1\0\1\u0122" +
+ "\1\u016d\1\u0122\1\u016d\6\u0122\1\0\4\u016d\4\u0122\1\u016d" +
+ "\2\u0122\1\u016d\3\u0122\1\u016d\2\0\20\u0122\4\0\4\u016e" +
+ "\5\0\1\u016e\1\0\1\u016e\5\0\1\u016e\3\0\2\u016e" +
+ "\21\0\1\u016e\4\0\2\u016e\4\0\2\u016e\1\0\2\u016e" +
+ "\3\0\1\u016e\1\0\3\201\4\u016f\1\63\1\0\3\201" +
+ "\1\u016f\1\201\1\u016f\5\201\1\u016f\3\201\2\u016f\21\201" +
+ "\1\u016f\4\201\2\u016f\4\201\2\u016f\1\201\2\u016f\3\201" +
+ "\1\u016f\1\201\27\0\1\u0170\63\0\1\u0171\116\0\1\u0172" +
+ "\130\0\1\u0173\27\0\1\u0174\147\0\1\u0175\15\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\356\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\1\0\3\73\4\u0176\2\73\1\216" +
+ "\2\73\1\u0176\1\217\1\u0176\5\73\1\u0176\3\73\2\u0176" +
+ "\21\73\1\u0176\4\73\2\u0176\4\73\2\u0176\1\73\2\u0176" +
+ "\3\73\1\u0176\1\73\30\0\1\101\1\102\1\u0177\1\u0178" +
+ "\7\0\1\u0179\21\0\1\110\43\0\1\u017a\101\0\1\u017b" +
+ "\125\0\1\u0133\44\0\1\u017c\135\0\1\u017d\45\0\1\u017e" +
+ "\74\0\1\u0133\103\0\1\u017f\124\0\1\342\102\0\1\u0180" +
+ "\101\0\1\u0133\36\0\1\u0181\77\0\1\u0182\115\0\1\u0183" +
+ "\70\0\1\u0133\127\0\1\u0130\15\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\2\4\1\u0184\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\1\4\1\u0185" +
+ "\1\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\33\0\1\u0186\130\0\1\u0187\60\0\1\u0188\34\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\u0189\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\2\4\1\u018a\15\4\32\0\1\u018b\47\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\3\4\1\u018c\2\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\3\4\1\u018d\2\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\u018e\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\15\0\1\u018f\16\0\1\u0190\12\0\1\u0191\11\0\1\u0192" +
+ "\2\0\1\u0193\42\0\1\u0194\64\0\1\u0195\65\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\u0196\5\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\1\4\1\356\16\4\14\0\1\u0197\65\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u0198" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\263\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\1\u012b\5\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\1\4\1\u0199\16\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\2\4\1\u0198\15\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\2\4" +
+ "\1\u019a\3\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\64\0\1\u019b\15\0\6\4\2\0\1\55" +
+ "\1\4\1\u019c\1\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\u019d\1\0\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\76\0\1\u019e\26\0\1\303\6\0\1\u019f\130\0\1\u015e" +
+ "\41\0\1\u01a0\113\0\1\u01a1\37\0\1\u01a2\76\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\6\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\3\4\1\u01a3\14\4\2\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\2\4\1\u01a4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\u01a5\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\u01a6\1\4\1\u01a7\4\4\5\0" +
+ "\1\u01a8\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\31\0\1\u0127\30\0\1\u012a\17\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\1\4\1\u01a9\4\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\2\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\u01aa\1\0\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\67\0\1\u01ab\3\0\1\u01ac\20\0\1\u01ad\112\0\1\u01ae" +
+ "\52\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\4\4\1\u01af\13\4\25\0" +
+ "\1\u01b0\2\0\1\u01b1\16\0\1\u01b2\14\0\1\u01b3\44\0" +
+ "\1\u01b4\35\0\1\u01ab\52\0\1\u0122\41\0\4\4\5\0" +
+ "\1\4\1\0\1\4\5\0\1\4\3\0\2\4\21\0" +
+ "\1\4\4\0\2\4\4\0\2\4\1\0\2\4\3\0" +
+ "\1\4\1\0\3\201\4\62\1\63\1\0\3\201\1\62" +
+ "\1\201\1\62\5\201\1\62\3\201\2\62\21\201\1\62" +
+ "\4\201\2\62\4\201\2\62\1\201\2\62\3\201\1\62" +
+ "\1\201\27\0\1\u01b5\103\0\1\u01b6\127\0\1\u01b7\27\0" +
+ "\1\u01b8\112\0\1\u019e\63\0\1\u01b9\65\0\3\73\4\14" +
+ "\2\73\1\216\2\73\1\14\1\217\1\14\5\73\1\14" +
+ "\3\73\2\14\21\73\1\14\4\73\2\14\4\73\2\14" +
+ "\1\73\2\14\3\73\1\14\1\73\63\0\1\u01ba\57\0" +
+ "\1\231\65\0\1\234\75\0\1\u01bb\76\0\1\u01bc\102\0" +
+ "\1\u01bd\73\0\1\u01be\76\0\1\u01bf\135\0\1\u01c0\76\0" +
+ "\1\u01bf\103\0\1\u01c1\43\0\1\u01c2\47\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u01c3" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\u01c4\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\64\0" +
+ "\1\u01c5\26\0\1\u01c6\100\0\1\u01c7\112\0\1\u01c8\52\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\u01c9\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\30\0\1\u01ca\51\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\u01cb\5\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\2\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\1\4\1\u01cc\16\4\33\0\1\u01cd\130\0\1\u01ce\1\u01cf" +
+ "\55\0\1\u01d0\101\0\1\u01d1\75\0\1\u01d2\51\0\1\u01d3" +
+ "\146\0\1\u01d4\42\0\1\u01d5\52\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\2\4\1\u01d6\3\4\6\0\3\4\1\0\2\4\1\0" +
+ "\3\4\3\0\20\4\27\0\1\u01d7\52\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\u01d8\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\1\u01d9\5\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\3\4\1\u01da\2\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\26\0" +
+ "\1\u01db\53\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\1\4\1\u01dc\16\4" +
+ "\2\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\u01dd\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\27\0\1\u01de\131\0" +
+ "\1\u01df\21\0\1\u01a2\26\0\1\u01e0\47\0\6\u01a2\3\0" +
+ "\3\u01a2\1\0\1\u01a2\3\0\1\u01a2\1\0\1\u01a2\1\0" +
+ "\6\u01a2\6\0\3\u01a2\1\0\2\u01a2\1\0\3\u01a2\3\0" +
+ "\20\u01a2\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\5\4\1\356\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\2\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\0\4\4\1\u012b\1\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\61\0\1\u01e1" +
+ "\52\0\1\u01e2\12\0\1\u01e3\11\0\1\u01e4\4\0\1\u01e5" +
+ "\13\0\6\4\2\0\1\55\1\u01e6\2\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\43\0\1\u01e7" +
+ "\23\0\1\u01ab\2\0\1\u019e\7\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\u01e8\1\0" +
+ "\6\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\2\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\u01e9\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\20\4\70\0\1\u019e" +
+ "\26\0\1\u019e\143\0\1\u01d5\56\0\1\u01ea\37\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\4\1\u01eb\4\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\23\0\1\u01ec\101\0" +
+ "\1\u01ed\117\0\1\u01ee\47\0\1\u01ef\112\0\1\u01f0\101\0" +
+ "\1\u01f1\74\0\1\u01f2\102\0\1\u0174\130\0\1\u019e\31\0" +
+ "\1\u01f3\143\0\1\u01f4\45\0\1\u01f5\75\0\1\u01f6\101\0" +
+ "\1\u01f7\132\0\1\u01f8\43\0\1\u01f9\64\0\1\342\111\0" +
+ "\1\u01fa\105\0\1\u01fb\46\0\6\4\2\0\1\55\1\4" +
+ "\1\u01cc\1\4\1\0\1\4\3\0\1\4\1\0\1\4" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\47\0\1\u0191\10\0\1\u01fc\3\0\1\u0193" +
+ "\45\0\1\u0195\62\0\1\u01fd\111\0\1\u01fe\134\0\1\u01ff" +
+ "\27\0\1\u0200\113\0\1\u0201\51\0\6\4\2\0\1\55" +
+ "\3\4\1\0\1\4\3\0\1\4\1\0\1\4\1\0" +
+ "\6\4\6\0\2\4\1\u0202\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\1\356\5\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\25\0\1\u0203\136\0\1\u0204\42\0\1\u0205\134\0\1\u0206" +
+ "\75\0\1\u0205\47\0\1\u0207\136\0\1\u0208\34\0\1\u0209" +
+ "\113\0\1\u020a\37\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\1\4\1\356\1\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\42\0\1\u020b\71\0\1\u020c\45\0\6\4\2\0" +
+ "\1\55\3\4\1\0\1\4\3\0\1\4\1\0\1\u020d" +
+ "\1\0\6\4\6\0\3\4\1\0\2\4\1\0\3\4" +
+ "\3\0\20\4\2\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\1\4\1\u012b" +
+ "\16\4\15\0\1\u020e\13\0\1\u0127\1\0\1\u0128\1\u0190" +
+ "\24\0\1\u0192\1\u012a\17\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\u020f\1\0\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\34\0\1\u0210\7\0\1\u0211\1\u0212\12\0\1\u0213\1\u0214" +
+ "\1\u0215\47\0\1\u0216\110\0\1\u015e\67\0\1\u0217\76\0" +
+ "\1\u0218\74\0\1\u0219\115\0\1\u021a\65\0\1\u021b\71\0" +
+ "\1\u021c\54\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\1\4\1\u021d\16\4" +
+ "\45\0\1\u021e\34\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\0\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\2\4\1\u021f" +
+ "\15\4\27\0\1\u0220\67\0\1\u0221\13\0\1\u0222\46\0" +
+ "\6\4\2\0\1\55\3\4\1\0\1\4\3\0\1\4" +
+ "\1\0\1\4\1\u0223\6\4\6\0\3\4\1\0\2\4" +
+ "\1\0\3\4\3\0\20\4\61\0\1\u0224\52\0\1\u0225" +
+ "\125\0\1\u0226\106\0\1\u0227\72\0\1\u0228\100\0\1\u019e" +
+ "\44\0\1\u0229\100\0\1\u0205\76\0\1\u01fb\145\0\1\u022a" +
+ "\27\0\1\u013d\114\0\1\u022b\64\0\1\u022c\101\0\1\u022d" +
+ "\57\0\1\u022e\116\0\1\u0133\130\0\1\u022f\46\0\1\u0230" +
+ "\106\0\1\u0231\63\0\1\u0232\76\0\1\u0233\104\0\1\u0234" +
+ "\47\0\6\4\2\0\1\55\3\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\4\4\1\u0235\13\4\14\0" +
+ "\1\u0236\116\0\1\u0237\71\0\1\u019e\102\0\1\u0174\77\0" +
+ "\1\u019e\74\0\1\u0238\103\0\1\u0127\13\0\1\u0129\14\0" +
+ "\1\u012a\34\0\1\u0221\77\0\1\u0221\13\0\1\u0239\113\0" +
+ "\1\u023a\32\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\2\4\1\356\15\4" +
+ "\65\0\1\u01cf\14\0\6\4\2\0\1\55\3\4\1\0" +
+ "\1\4\3\0\1\4\1\0\1\4\1\u023b\6\4\6\0" +
+ "\3\4\1\0\2\4\1\0\3\4\3\0\20\4\13\0" +
+ "\1\u023c\13\0\1\u023d\134\0\1\u023e\27\0\1\u023f\130\0" +
+ "\1\u0240\45\0\1\u0241\131\0\1\u0242\62\0\1\u0243\102\0" +
+ "\1\u015e\100\0\1\u0174\73\0\1\u0244\131\0\1\u0245\47\0" +
+ "\1\u0246\74\0\1\u0247\52\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\0\1\u0248" +
+ "\5\4\6\0\3\4\1\0\2\4\1\0\3\4\3\0" +
+ "\20\4\63\0\1\u0249\16\0\6\4\2\0\1\55\3\4" +
+ "\1\0\1\4\3\0\1\4\1\0\1\4\1\u024a\6\4" +
+ "\6\0\3\4\1\0\2\4\1\0\3\4\3\0\20\4" +
+ "\64\0\1\u024b\45\0\1\u024c\112\0\1\u024d\57\0\1\u024e" +
+ "\77\0\1\u024f\65\0\1\u0250\111\0\1\u0251\77\0\1\u0252" +
+ "\140\0\1\u0253\25\0\1\u0254\116\0\1\u0177\130\0\1\u0255" +
+ "\42\0\1\u0256\117\0\1\u0257\57\0\1\u013d\115\0\1\u0258" +
+ "\57\0\1\u01d5\105\0\1\u0239\77\0\1\u0128\11\0\1\u0129" +
+ "\14\0\1\u012a\64\0\1\u0259\115\0\1\u025a\14\0\6\4" +
+ "\2\0\1\55\1\4\1\356\1\4\1\0\1\4\3\0" +
+ "\1\4\1\0\1\4\1\0\6\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\63\0\1\u025b\41\0" +
+ "\1\u025c\133\0\1\u0174\63\0\1\u025d\77\0\1\u025e\116\0" +
+ "\1\u025f\57\0\1\u0260\65\0\1\u0261\100\0\1\u0262\73\0" +
+ "\1\u0263\100\0\1\u0264\103\0\1\u0265\73\0\1\u0266\76\0" +
+ "\1\u015e\115\0\1\u0267\57\0\1\u0268\106\0\1\u0269\106\0" +
+ "\1\u026a\36\0\6\4\2\0\1\55\3\4\1\0\1\4" +
+ "\3\0\1\4\1\0\1\4\1\0\6\4\6\0\3\4" +
+ "\1\0\2\4\1\0\3\4\3\0\4\4\1\u026b\13\4" +
+ "\43\0\1\u0253\70\0\1\u026c\71\0\1\u026d\133\0\1\u026e" +
+ "\44\0\1\u026f\64\0\1\u0270\6\0\1\u0271\120\0\1\u0272" +
+ "\66\0\1\u0273\106\0\1\u016b\116\0\1\u0274\105\0\1\u01ab" +
+ "\71\0\1\u0205\32\0\1\u0133\115\0\1\u0133\112\0\1\u0275" +
+ "\114\0\1\u019e\43\0\1\u0276\77\0\1\u0277\100\0\1\u0278" +
+ "\102\0\1\u0279\74\0\1\u027a\77\0\1\u027b\101\0\1\u019e" +
+ "\73\0\1\u027c\101\0\1\u027d\135\0\1\u027e\37\0\1\u027f" +
+ "\101\0\1\u0280\77\0\1\u0281\75\0\1\u0282\66\0\1\u0283" +
+ "\125\0\1\u0284\71\0\1\u019e\127\0\1\u0285\15\0\6\4" +
+ "\2\0\1\55\3\4\1\0\1\4\3\0\1\4\1\0" +
+ "\1\4\1\0\1\4\1\356\4\4\6\0\3\4\1\0" +
+ "\2\4\1\0\3\4\3\0\20\4\65\0\1\u0286\43\0" +
+ "\1\u0127\1\0\1\u0128\11\0\1\u0129\114\0\1\u0207\104\0" +
+ "\1\u01ab\7\0\1\u019e\27\0\1\u0287\115\0\1\u0174\61\0" +
+ "\1\u0288\77\0\1\u0289\77\0\1\u0251\77\0\1\u028a\102\0" +
+ "\1\u028b\127\0\1\u028c\60\0\1\u019e\50\0\1\u019e\162\0" +
+ "\1\u019e\61\0\1\u0278\46\0\1\u028d\114\0\1\u028e\120\0" +
+ "\1\u028f\41\0\1\u0290\62\0\1\u0291\150\0\1\u0292\74\0" +
+ "\1\u0293\101\0\1\u0294\57\0\1\u01e7\23\0\1\u01ab\3\0" +
+ "\1\u01ac\66\0\1\u0295\31\0\1\u0296\110\0\1\u0207\117\0" +
+ "\1\u0297\60\0\1\u0298\132\0\1\u0299\46\0\1\u029a\101\0" +
+ "\1\u029b\107\0\1\u029c\116\0\1\u028d\102\0\1\u029d\44\0" +
+ "\1\u029e\100\0\1\u029f\133\0\1\u028d\40\0\1\u028d\112\0" +
+ "\1\u02a0\63\0\1\u02a1\132\0\1\u02a2\102\0\1\u0279\62\0" +
+ "\1\u0191\14\0\1\u0193\56\0\1\u0133\64\0\1\u02a3\76\0" +
+ "\1\u02a4\100\0\1\u02a5\77\0\1\u02a6\101\0\1\u02a7\100\0" +
+ "\1\u028d\135\0\1\u02a8\35\0\1\u02a9\13\0\1\u02aa\77\0" +
+ "\1\u02ab\66\0\1\u02ac\77\0\1\u019e\77\0\1\u02ad\111\0" +
+ "\1\u02ae\114\0\1\u02af\31\0\1\u02b0\151\0\1\u02b1\44\0" +
+ "\1\u02b2\75\0\1\u02b3\134\0\1\u028d\26\0\1\u02b4\126\0" +
+ "\1\u027d\61\0\1\u028d\140\0\1\u02b5\55\0\1\u0205\47\0" +
+ "\1\u02b6\147\0\1\u02b7\76\0\1\u0205\31\0\1\u02b8\144\0" +
+ "\1\u01f3\31\0\1\u02b9\147\0\1\u019e\60\0\1\u02ba\130\0" +
+ "\1\u02bb\26\0\1\u02bc\134\0\1\u02bd\16\0";
+
+ private static int[] zzUnpackTrans() {
+ int[] result = new int[43456];
+ int offset = 0;
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackTrans(String packed, int offset, int[] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ value--;
+ do
+ result[j++] = value;
+ while (--count > 0);
+ }
+ return j;
+ }
+
+ /* error codes */
+ private static final int ZZ_UNKNOWN_ERROR = 0;
+ private static final int ZZ_NO_MATCH = 1;
+ private static final int ZZ_PUSHBACK_2BIG = 2;
+
+ /* error messages for the codes above */
+ private static final String ZZ_ERROR_MSG[] = {
+ "Unkown internal scanner error",
+ "Error: could not match input",
+ "Error: pushback value was too large"
+ };
+
+ /**
+ * ZZ_ATTRIBUTE[aState] contains the attributes of state aState
+ */
+ private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+ private static final String ZZ_ATTRIBUTE_PACKED_0 =
+ "\2\0\1\11\4\1\1\11\4\1\1\11\13\1\2\11" +
+ "\16\1\1\11\3\1\1\0\1\1\1\0\3\1\1\11" +
+ "\1\0\10\1\1\11\1\1\12\0\33\1\6\0\1\11" +
+ "\1\0\15\1\5\0\1\1\1\0\2\1\1\11\14\1" +
+ "\1\11\1\1\20\0\35\1\7\0\10\1\1\0\2\1" +
+ "\5\0\1\1\2\0\1\1\1\0\2\1\22\0\5\1" +
+ "\1\0\11\1\1\0\2\1\1\0\6\1\1\0\2\1" +
+ "\11\0\4\1\1\0\4\1\2\0\2\1\2\0\1\1" +
+ "\1\0\1\1\6\0\2\1\6\0\1\11\13\0\2\1" +
+ "\3\0\2\1\1\0\3\1\3\0\2\1\1\0\6\1" +
+ "\1\0\3\1\5\0\4\1\1\0\2\1\3\0\1\1" +
+ "\5\0\1\1\6\0\1\1\7\0\1\1\4\0\3\1" +
+ "\4\0\1\1\1\0\2\1\10\0\1\1\1\0\3\1" +
+ "\1\0\2\1\1\11\3\0\3\1\2\0\1\1\1\0" +
+ "\2\1\3\0\2\1\23\0\1\1\7\0\2\1\10\0" +
+ "\3\1\1\0\2\1\1\0\1\1\11\0\1\1\1\0" +
+ "\1\1\2\0\1\1\22\0\1\1\3\0\1\1\12\0" +
+ "\1\1\1\0\1\1\15\0\1\1\1\0\1\1\25\0" +
+ "\1\1\22\0\1\1\10\0\1\1\26\0\1\1\2\0" +
+ "\1\1\35\0\1\1\3\0\1\1\6\0\1\1\50\0" +
+ "\1\11";
+
+ private static int[] zzUnpackAttribute() {
+ int[] result = new int[701];
+ int offset = 0;
+ offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackAttribute(String packed, int offset, int[] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ do
+ result[j++] = value;
+ while (--count > 0);
+ }
+ return j;
+ }
+
+ /** the input device */
+ private Reader zzReader;
+
+ /** the current state of the DFA */
+ private int zzState;
+
+ /** the current lexical state */
+ private int zzLexicalState = YYINITIAL;
+
+ /**
+ * this buffer contains the current text to be matched and is
+ * the source of the yytext() string
+ */
+ private char zzBuffer[];
+
+ /** the textposition at the last accepting state */
+ private int zzMarkedPos;
+
+ /** the textposition at the last state to be included in yytext */
+ private int zzPushbackPos;
+
+ /** the current text position in the buffer */
+ private int zzCurrentPos;
+
+ /** startRead marks the beginning of the yytext() string in the buffer */
+ private int zzStartRead;
+
+ /**
+ * endRead marks the last character in the buffer, that has been read
+ * from input
+ */
+ private int zzEndRead;
+
+ /** number of newlines encountered up to the start of the matched text */
+ private int yyline;
+
+ /** the number of characters up to the start of the matched text */
+ private int yychar;
+
+ /**
+ * the number of characters from the last newline up to the start of the
+ * matched text
+ */
+ private int yycolumn;
+
+ /**
+ * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+ */
+ private boolean zzAtBOL = true;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+ /**
+ * Constructor. This must be here because JFlex does not generate a
+ * no-parameter constructor.
+ */
+ public SmaliTokenMaker() {
+ }
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addToken(int, int, int)
+ */
+ private void addHyperlinkToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start, end, tokenType, so, true);
+ }
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ */
+ private void addToken(int tokenType) {
+ addToken(zzStartRead, zzMarkedPos - 1, tokenType);
+ }
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param tokenType The token's type.
+ * @see #addHyperlinkToken(int, int, int)
+ */
+ private void addToken(int start, int end, int tokenType) {
+ int so = start + offsetShift;
+ addToken(zzBuffer, start, end, tokenType, so, false);
+ }
+
+ /**
+ * Adds the token specified to the current linked list of tokens.
+ *
+ * @param array The character array.
+ * @param start The starting offset in the array.
+ * @param end The ending offset in the array.
+ * @param tokenType The token's type.
+ * @param startOffset The offset in the document at which this token
+ * occurs.
+ * @param hyperlink Whether this token is a hyperlink.
+ */
+ public void addToken(char[] array, int start, int end, int tokenType,
+ int startOffset, boolean hyperlink) {
+ super.addToken(array, start, end, tokenType, startOffset, hyperlink);
+ zzStartRead = zzMarkedPos;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getLineCommentStartAndEnd(int languageIndex) {
+ return new String[] { "#", null };
+ }
+
+ /**
+ * Returns the first token in the linked list of tokens generated
+ * from text
. This method must be implemented by
+ * subclasses so they can correctly implement syntax highlighting.
+ *
+ * @param text The text from which to get tokens.
+ * @param initialTokenType The token type we should start with.
+ * @param startOffset The offset into the document at which
+ * text
starts.
+ * @return The first Token
in a linked list representing
+ * the syntax highlighted text.
+ */
+ public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
+
+ resetTokenList();
+ this.offsetShift = -text.offset + startOffset;
+
+ // Start off in the proper state.
+ int state = Token.NULL;
+ switch (initialTokenType) {
+ /* No multi-line comments */
+ /* No documentation comments */
+ default:
+ state = Token.NULL;
+ }
+
+ s = text;
+ try {
+ yyreset(zzReader);
+ yybegin(state);
+ return yylex();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ return new TokenImpl();
+ }
+
+ }
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return true
if EOF was reached, otherwise
+ * false
.
+ */
+ private boolean zzRefill() {
+ return zzCurrentPos >= s.offset + s.count;
+ }
+
+ /**
+ * Resets the scanner to read from a new input stream.
+ * Does not close the old reader.
+ *
+ * All internal variables are reset, the old input stream
+ * cannot be reused (internal buffer is discarded and lost).
+ * Lexical state is set to YY_INITIAL.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(Reader reader) {
+ // 's' has been updated.
+ zzBuffer = s.array;
+ /*
+ * We replaced the line below with the two below it because zzRefill
+ * no longer "refills" the buffer (since the way we do it, it's always
+ * "full" the first time through, since it points to the segment's
+ * array). So, we assign zzEndRead here.
+ */
+ // zzStartRead = zzEndRead = s.offset;
+ zzStartRead = s.offset;
+ zzEndRead = zzStartRead + s.count - 1;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
+ zzLexicalState = YYINITIAL;
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ }
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public SmaliTokenMaker(Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public SmaliTokenMaker(InputStream in) {
+ this(new InputStreamReader(in));
+ }
+
+ /**
+ * Unpacks the compressed character translation table.
+ *
+ * @param packed the packed character translation table
+ * @return the unpacked character translation table
+ */
+ private static char[] zzUnpackCMap(String packed) {
+ char[] map = new char[0x10000];
+ int i = 0; /* index in packed string */
+ int j = 0; /* index in unpacked array */
+ while (i < 188) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do
+ map[j++] = value;
+ while (--count > 0);
+ }
+ return map;
+ }
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public final String yytext() {
+ return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
+ }
+
+ /**
+ * Returns the character at position pos from the
+ * matched text.
+ *
+ * It is equivalent to yytext().charAt(pos), but faster
+ *
+ * @param pos the position of the character to fetch.
+ * A value from 0 to yylength()-1.
+ *
+ * @return the character at position pos
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead + pos];
+ }
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public final int yylength() {
+ return zzMarkedPos - zzStartRead;
+ }
+
+ /**
+ * Reports an error that occured while scanning.
+ *
+ * In a wellformed scanner (no or only correct usage of
+ * yypushback(int) and a match-all fallback rule) this method
+ * will only be called with things that "Can't Possibly Happen".
+ * If this method is called, something is seriously wrong
+ * (e.g. a JFlex bug producing a faulty scanner etc.).
+ *
+ * Usual syntax/scanner level error handling should be done
+ * in error fallback rules.
+ *
+ * @param errorCode the code of the errormessage to display
+ */
+ private void zzScanError(int errorCode) {
+ String message;
+ try {
+ message = ZZ_ERROR_MSG[errorCode];
+ } catch (ArrayIndexOutOfBoundsException e) {
+ message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+ }
+
+ throw new Error(message);
+ }
+
+ /**
+ * Pushes the specified amount of characters back into the input stream.
+ *
+ * They will be read again by then next call of the scanning method
+ *
+ * @param number the number of characters to be read again.
+ * This number must not be greater than yylength()!
+ */
+ public void yypushback(int number) {
+ if (number > yylength())
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+ /**
+ * Resumes scanning until the next regular expression is matched,
+ * the end of input is encountered or an I/O-Error occurs.
+ *
+ * @return the next token
+ * @exception IOException if any I/O-Error occurs
+ */
+ public Token yylex() throws IOException {
+ int zzInput;
+ int zzAction;
+
+ // cached fields:
+ int zzCurrentPosL;
+ int zzMarkedPosL;
+ int zzEndReadL = zzEndRead;
+ char[] zzBufferL = zzBuffer;
+ char[] zzCMapL = ZZ_CMAP;
+
+ int[] zzTransL = ZZ_TRANS;
+ int[] zzRowMapL = ZZ_ROWMAP;
+ int[] zzAttrL = ZZ_ATTRIBUTE;
+
+ while (true) {
+ zzMarkedPosL = zzMarkedPos;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+ zzForAction: {
+ while (true) {
+
+ if (zzCurrentPosL < zzEndReadL)
+ zzInput = zzBufferL[zzCurrentPosL++];
+ else if (zzAtEOF) {
+ zzInput = YYEOF;
+ break zzForAction;
+ } else {
+ // store back cached positions
+ zzCurrentPos = zzCurrentPosL;
+ zzMarkedPos = zzMarkedPosL;
+ boolean eof = zzRefill();
+ // get translated positions and possibly new buffer
+ zzCurrentPosL = zzCurrentPos;
+ zzMarkedPosL = zzMarkedPos;
+ zzBufferL = zzBuffer;
+ zzEndReadL = zzEndRead;
+ if (eof) {
+ zzInput = YYEOF;
+ break zzForAction;
+ } else {
+ zzInput = zzBufferL[zzCurrentPosL++];
+ }
+ }
+ int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
+ if (zzNext == -1)
+ break zzForAction;
+ zzState = zzNext;
+
+ int zzAttributes = zzAttrL[zzState];
+ if ((zzAttributes & 1) == 1) {
+ zzAction = zzState;
+ zzMarkedPosL = zzCurrentPosL;
+ if ((zzAttributes & 8) == 8)
+ break zzForAction;
+ }
+
+ }
+ }
+
+ // store back cached position
+ zzMarkedPos = zzMarkedPosL;
+
+ switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+ case 4: {
+ addNullToken();
+ return firstToken;
+ }
+ case 27:
+ break;
+ case 19: {
+ addToken(Token.LITERAL_CHAR);
+ }
+ case 28:
+ break;
+ case 26: {
+ addToken(Token.MARKUP_TAG_NAME);
+ }
+ case 29:
+ break;
+ case 7: {
+ addToken(Token.WHITESPACE);
+ }
+ case 30:
+ break;
+ case 18: {
+ addToken(Token.LITERAL_NUMBER_HEXADECIMAL);
+ }
+ case 31:
+ break;
+ case 21: {
+ addToken(Token.ERROR_STRING_DOUBLE);
+ }
+ case 32:
+ break;
+ case 17: {
+ addToken(Token.LITERAL_NUMBER_FLOAT);
+ }
+ case 33:
+ break;
+ case 22: {
+ addToken(Token.RESERVED_WORD);
+ }
+ case 34:
+ break;
+ case 8: {
+ addToken(Token.SEPARATOR);
+ }
+ case 35:
+ break;
+ case 10: {
+ addToken(Token.VARIABLE);
+ }
+ case 36:
+ break;
+ case 1: {
+ addToken(Token.IDENTIFIER);
+ }
+ case 37:
+ break;
+ case 13: {
+ addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
+ addNullToken();
+ return firstToken;
+ }
+ case 38:
+ break;
+ case 20: {
+ addToken(Token.FUNCTION);
+ }
+ case 39:
+ break;
+ case 3: {
+ addToken(Token.ERROR_CHAR);
+ addNullToken();
+ return firstToken;
+ }
+ case 40:
+ break;
+ case 5: {
+ addToken(Token.ERROR_STRING_DOUBLE);
+ addNullToken();
+ return firstToken;
+ }
+ case 41:
+ break;
+ case 11: {
+ addToken(Token.DATA_TYPE);
+ }
+ case 42:
+ break;
+ case 15: {
+ addToken(Token.ERROR_CHAR);
+ }
+ case 43:
+ break;
+ case 23: {
+ addToken(Token.LITERAL_BOOLEAN);
+ }
+ case 44:
+ break;
+ case 16: {
+ addToken(Token.LITERAL_STRING_DOUBLE_QUOTE);
+ }
+ case 45:
+ break;
+ case 24: {
+ int temp = zzStartRead;
+ addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
+ addHyperlinkToken(temp, zzMarkedPos - 1, Token.COMMENT_EOL);
+ start = zzMarkedPos;
+ }
+ case 46:
+ break;
+ case 25: {
+ addToken(Token.RESERVED_WORD_2);
+ }
+ case 47:
+ break;
+ case 14: {
+ addToken(Token.ERROR_NUMBER_FORMAT);
+ }
+ case 48:
+ break;
+ case 6: {
+ start = zzMarkedPos - 1;
+ yybegin(EOL_COMMENT);
+ }
+ case 49:
+ break;
+ case 2: {
+ addToken(Token.LITERAL_NUMBER_DECIMAL_INT);
+ }
+ case 50:
+ break;
+ case 9: {
+ addToken(Token.OPERATOR);
+ }
+ case 51:
+ break;
+ case 12: {
+ }
+ case 52:
+ break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ switch (zzLexicalState) {
+ case EOL_COMMENT: {
+ addToken(start, zzStartRead - 1, Token.COMMENT_EOL);
+ addNullToken();
+ return firstToken;
+ }
+ case 702:
+ break;
+ case YYINITIAL: {
+ addNullToken();
+ return firstToken;
+ }
+ case 703:
+ break;
+ default:
+ return null;
+ }
+ } else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+}