diff --git a/trunk/lib/jsyntaxpane-0.9.5.jar b/trunk/lib/jsyntaxpane-0.9.5.jar index 5826bdabc..735b1947c 100644 Binary files a/trunk/lib/jsyntaxpane-0.9.5.jar and b/trunk/lib/jsyntaxpane-0.9.5.jar differ diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex index 4e02c14fe..8482afaa9 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/flasm3.flex @@ -13,6 +13,7 @@ import jsyntaxpane.TokenType; %extends DefaultJFlexLexer %final %unicode +%ignorecase %char %type Token @@ -35,6 +36,9 @@ import jsyntaxpane.TokenType; return yychar; } + private static final byte PARAN = 1; + private static final byte BRACKET = 2; + private static final byte LESSGREATER = 3; %} /* main character classes */ @@ -101,6 +105,28 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" {Label} {return token(TokenType.IDENTIFIER,yychar,yylength()-1); } + + + + + + "try" | + "flag" | + "param" | + "paramname" | + "optional" | + "returns" | + "body" | + "maxstack" | + "localcount" | + "initscopedepth" | + "maxscopedepth" | + "name" | + "trait" | + "method" | + "code" { yybegin(PARAMETERS); + return token(TokenType.KEYWORD);} + /* identifiers */ {InstructionName} { yybegin(PARAMETERS); return token(TokenType.KEYWORD); } @@ -108,6 +134,76 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" } { + "from" | + "to" | + "target" | + "name" | + "type" { return token(TokenType.KEYWORD);} + /* multinames */ + "QName" | + "QNameA" | + "RTQName" | + "RTQNameA" | + "RTQNameL" | + "RTQNameLA" | + "Multiname" | + "MultinameL" | + "MultinameLA" | + "TypeName" | + "null" { return token(TokenType.KEYWORD2);} + "(" { return token(TokenType.OPERATOR,PARAN); } + ")" { return token(TokenType.OPERATOR,-PARAN); } + "[" { return token(TokenType.OPERATOR,BRACKET); } + "]" { return token(TokenType.OPERATOR,-BRACKET); } + "<" { return token(TokenType.OPERATOR,LESSGREATER); } + ">" { return token(TokenType.OPERATOR,-LESSGREATER); } + "Namespace" | + "PrivateNamespace" | + "PackageNamespace" | + "PackageInternalNs" | + "ProtectedNamespace" | + "ExplicitNamespace" | + "StaticProtectedNs" { return token(TokenType.KEYWORD2);} + "," { return token(TokenType.OPERATOR); } + + + /*Flags*/ + "EXPLICIT" | + "HAS_OPTIONAL" | + "HAS_PARAM_NAMES" | + "IGNORE_REST" | + "NEED_ACTIVATION" | + "NEED_ARGUMENTS" | + "NEED_REST" | + "SET_DXNS" { return token(TokenType.KEYWORD2);} + + "dispid" | + "value" | + "slotid" { return token(TokenType.KEYWORD);} + + + /* Value types*/ + "Integer" | + "UInteger" | + "Double" | + "Decimal" | + "Utf8" | + "True" | + "False" | + "Undefined" { return token(TokenType.KEYWORD2);} + + "FINAL" | + "OVERRIDE" | + "METADATA" { return token(TokenType.KEYWORD2);} + + "slot" | + "const" | + "method" | + "getter" | + "setter" | + "class" | + "function" { return token(TokenType.KEYWORD2);} + /* string literal */ \" { yybegin(STRING); diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties index 1cc2858ba..294e05903 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Toggle Token Marker # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties index e8bc11678..14f9e3fce 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = P\u0159epnout ozna\u010dova\u010d Token\u0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 \ No newline at end of file diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties index 577faecd3..47aa46bf3 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties @@ -1,4 +1,4 @@ -Action.combo-completion.MenuText = W\u00E4hlen Sie einen Befehl aus +Action.combo-completion.MenuText = W\u00e4hlen Sie einen Befehl aus Action.toggle-token-marker.MenuText = Markierung umschalten # !!!! FFDec translators - please do not edit anything below this line !!! @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Markierung umschalten # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties index 8b4685cab..540f6533a 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Alternar marcador de Token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -38,3 +39,7 @@ PopupMenu = \ - , \ toggle-lines , \ toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties index 80ecc485e..98027a9d7 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Token Marker megjelen\u00edt\u00e9se/elrej # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties index 05ba176c7..84b012af7 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Token markering inschakelen # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -38,3 +39,7 @@ PopupMenu = \ - , \ toggle-lines , \ toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties index e650d5a1e..cd88b6c7e 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = Alternar marcador de token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -38,3 +39,7 @@ PopupMenu = \ - , \ toggle-lines , \ toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties index 550398b90..e3e01c5b7 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties @@ -1,5 +1,5 @@ -Action.combo-completion.MenuText = \u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0438\u044E -Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u043E\u043A\u0435\u043D\u043E\u0432 +Action.combo-completion.MenuText = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e +Action.toggle-token-marker.MenuText = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties index 5bc13eaec..0c17cbe5d 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = V\u00e4xla Tecken Mark\u00f6r # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties index 63f3d838d..9dec78fe6 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties @@ -1,5 +1,5 @@ -Action.combo-completion.MenuText = \u041E\u0431\u0435\u0440\u0456\u0442\u044C \u0456\u043D\u0441\u0442\u0440\u0443\u043A\u0446\u0456\u044E -Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043B\u0435\u043D\u043D\u044F \u0442\u043E\u043A\u0435\u043D\u0456\u0432 +Action.combo-completion.MenuText = \u041e\u0431\u0435\u0440\u0456\u0442\u044c \u0456\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0456\u044e +Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u0442\u043e\u043a\u0435\u043d\u0456\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties index 52f199567..96cc1dbed 100644 --- a/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties +++ b/trunk/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties @@ -7,7 +7,8 @@ Action.toggle-token-marker.MenuText = \u5207\u6362\u4ee4\u724c\u6807\u8bb0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # @@ -37,4 +38,8 @@ PopupMenu = \ ${DEFAULT_EDIT_MENU} , \ - , \ toggle-lines , \ - toggle-token-marker \ No newline at end of file + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/trunk/resources/ffdec.sh b/trunk/resources/ffdec.sh index 2394a091c..f5cf42837 100644 --- a/trunk/resources/ffdec.sh +++ b/trunk/resources/ffdec.sh @@ -1,2 +1,80 @@ #!/bin/sh -java -Xmx1024m -jar ffdec.jar $@ \ No newline at end of file +# FFDec requires Oracle Java 7 +# Look for java in these directories +LOOKUP_JRE_DIRS="/usr/lib/jvm/* /opt/java* /opt/jre*" +#Created by Petris 2009 -> Many thanks! +# Required version +REQ_JVER1=1 +REQ_JVER2=7 +REQ_JVER3=0 +REQ_JVER4=0 +JAR_FILE=ffdec.jar +MEMORY=1024m + +check_java_version () { + JVER1=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "\([0-9]*\)\.[0-9]*\.[0-9]*_[0-9]*".*/\1/'` + JVER2=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "[0-9]*\.\([0-9]*\)\.[0-9]*_[0-9]*".*/\1/'` + JVER3=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "[0-9]*\.[0-9]*\.\([0-9]*\)_[0-9]*".*/\1/'` + JVER4=`echo $JAVA_VERSION_OUTPUT | sed 's/java version "[0-9]*\.[0-9]*\.[0-9]*_\([0-9]*\)".*/\1/'` + + if [ $JVER1 -gt $REQ_JVER1 ]; then + return 0 + elif [ $JVER1 -lt $REQ_JVER1 ]; then + return 1 + fi + + if [ $JVER2 -gt $REQ_JVER2 ]; then + return 0 + elif [ $JVER2 -lt $REQ_JVER2 ]; then + return 1 + fi + + if [ $JVER3 -gt $REQ_JVER3 ]; then + return 0 + elif [ $JVER3 -lt $REQ_JVER3 ]; then + return 1 + fi + + if [ $JVER4 -lt $REQ_JVER4 ]; then + return 1 + fi + + return 0 +} + +# Handle symlinks +PROGRAM="$0" +while [ -L "$PROGRAM" ]; do + PROGRAM=`readlink -f "$PROGRAM"` +done +cd "`dirname \"$PROGRAM\"`" + +# Check default java +if [ -x "`which java`" ]; then + JAVA_VERSION_OUTPUT=`java -version 2>&1` + check_java_version && exec java -Djava.net.preferIPv4Stack=true -Xmx$MEMORY -jar $JAR_FILE $@ +fi + +# Test other possible Java locations +for JRE_PATH in $LOOKUP_JRE_DIRS; do + if [ -x "$JRE_PATH/bin/java" ]; then + JAVA_VERSION_OUTPUT=`"$JRE_PATH/bin/java" -version 2>&1` + check_java_version && { + export JRE_PATH + exec $JRE_PATH/bin/java -Djava.net.preferIPv4Stack=true -Xmx$MEMORY -jar $JAR_FILE $@ + } + fi +done + +# Failed +if [ -x "`which xmessage`" ]; then + xmessage -nearmouse -file - < m = getResponseHeaders(); - if(m == null){ - return null; + if (m == null) { + return null; } for (String k : m.keySet()) { if (k.toLowerCase().equals(header.toLowerCase())) { diff --git a/trunk/src/com/jpexs/browsers/cache/chrome/Index.java b/trunk/src/com/jpexs/browsers/cache/chrome/Index.java index 15e6ed5b6..9e9217f66 100644 --- a/trunk/src/com/jpexs/browsers/cache/chrome/Index.java +++ b/trunk/src/com/jpexs/browsers/cache/chrome/Index.java @@ -9,8 +9,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; /** * @@ -49,17 +47,17 @@ public class Index { public Index(File file, File externalFilesDir) throws IOException { dataFiles = new HashMap<>(); this.externalFilesDir = externalFilesDir; - FileInputStream is = new FileInputStream(file); - rootDir = file.getParentFile(); - header = new IndexHeader(is, rootDir, dataFiles, externalFilesDir); - int tsize = kIndexTablesize; - if (header.table_len > 0) { - tsize = header.table_len; + try (FileInputStream is = new FileInputStream(file)) { + rootDir = file.getParentFile(); + header = new IndexHeader(is, rootDir, dataFiles, externalFilesDir); + int tsize = kIndexTablesize; + if (header.table_len > 0) { + tsize = header.table_len; + } + table = new CacheAddr[tsize]; + for (int i = 0; i < tsize; i++) { + table[i] = new CacheAddr(is, rootDir, dataFiles, externalFilesDir); + } } - table = new CacheAddr[tsize]; - for (int i = 0; i < tsize; i++) { - table[i] = new CacheAddr(is, rootDir, dataFiles, externalFilesDir); - } - is.close(); } } diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java b/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java index e25835dba..4299cf496 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/FirefoxCache.java @@ -34,7 +34,7 @@ public class FirefoxCache implements CacheImplementation { @Override public void refresh() { File dir = getCacheDirectory(); - if(dir==null){ + if (dir == null) { return; } File cacheMapFile = new File(dir, "_CACHE_MAP_"); @@ -108,10 +108,10 @@ public class FirefoxCache implements CacheImplementation { if (profileDir != null) { cacheDir = new File(profileDir, "Cache"); } - if(cacheDir == null){ + if (cacheDir == null) { return null; } - if(!cacheDir.exists()){ + if (!cacheDir.exists()) { return null; } return cacheDir; diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java b/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java index 4003ff983..ad84b4aff 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/IncompatibleVersionException.java @@ -22,8 +22,7 @@ package com.jpexs.browsers.cache.firefox; */ public class IncompatibleVersionException extends Exception { - public IncompatibleVersionException(int version) { - super("Incompatible version: "+version); - } - + public IncompatibleVersionException(int version) { + super("Incompatible version: " + version); + } } diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java b/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java index 148b9562f..ae54aa2a2 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/MapBucket.java @@ -38,8 +38,7 @@ public class MapBucket extends CacheEntry { if (metadata == null) { try { metadata = new MetaData(getMetaDataStream()); - }catch(IncompatibleVersionException ie){ - + } catch (IncompatibleVersionException ie) { } catch (IOException ex) { Logger.getLogger(MapBucket.class.getName()).log(Level.SEVERE, null, ex); } @@ -71,8 +70,8 @@ public class MapBucket extends CacheEntry { return null; } String responseHead = m.response.get("response-head"); - if(responseHead==null){ - return null; + if (responseHead == null) { + return null; } String headers[] = responseHead.split("\r\n"); Map ret = new HashMap<>(); diff --git a/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java b/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java index e6ca79f18..57f2b84b4 100644 --- a/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java +++ b/trunk/src/com/jpexs/browsers/cache/firefox/MetaData.java @@ -27,8 +27,8 @@ public class MetaData { public MetaData(InputStream is) throws IOException, IncompatibleVersionException { CacheInputStream cis = new CacheInputStream(is); majorVersion = cis.readInt16(); - if(majorVersion!=1){ - throw new IncompatibleVersionException(majorVersion); + if (majorVersion != 1) { + throw new IncompatibleVersionException(majorVersion); } minorVersion = cis.readInt16(); location = cis.readInt32(); diff --git a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java index a8716a3c4..bdf7fac91 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -528,7 +528,7 @@ public class SWFInputStream extends InputStream { } public List readActionList(List listeners, long containerSWFOffset, ReReadableInputStream rri, int maxlen, String path) throws IOException { - return ActionListReader.readActionList(listeners, containerSWFOffset, rri, version, (int)rri.getPos(), (int)rri.getPos() + maxlen, path); + return ActionListReader.readActionList(listeners, containerSWFOffset, rri, version, (int) rri.getPos(), (int) rri.getPos() + maxlen, path); } private static void dumpTag(PrintStream out, int version, Tag tag, int level) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java index 19e188395..35cafdcbf 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -88,14 +88,14 @@ public class ABC { public int removeDeadCode() { int rem = 0; for (MethodBody body : bodies) { - rem += body.removeDeadCode(constants); + rem += body.removeDeadCode(constants, null/*FIXME*/, method_info[body.method_info]); } return rem; } public void restoreControlFlow() { for (MethodBody body : bodies) { - body.restoreControlFlow(constants); + body.restoreControlFlow(constants, null/*FIXME*/, method_info[body.method_info]); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 0e3831c93..62ddcb507 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -65,7 +65,10 @@ import com.jpexs.decompiler.flash.abc.types.ABCException; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.MethodInfo; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.ValueKind; import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitFunction; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.ecma.EcmaScript; @@ -715,19 +718,147 @@ public class AVM2Code implements Serializable { return s.toString(); } - public String toASMSource(ConstantPool constants, MethodBody body, boolean hex, boolean highlight) { - return toASMSource(constants, body, new ArrayList(), hex, highlight); + public String toASMSource(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, boolean hex, boolean highlight) { + return toASMSource(constants, trait, info, body, new ArrayList(), hex, highlight); } - public String toASMSource(ConstantPool constants, MethodBody body, List outputMap, boolean hex, boolean highlight) { + public String toASMSource(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, List outputMap, boolean hex, boolean highlight) { invalidateCache(); StringBuilder ret = new StringBuilder(); String t = ""; - for (int e = 0; e < body.exceptions.length; e++) { - ret.append("exception " + e + " m[" + body.exceptions[e].name_index + "]\"" + Helper.escapeString(body.exceptions[e].getVarName(constants, new ArrayList())) + "\" " - + "m[" + body.exceptions[e].type_index + "]\"" + Helper.escapeString(body.exceptions[e].getTypeName(constants, new ArrayList())) + "\"\n"); + if (trait != null) { + if (trait instanceof TraitFunction) { + TraitFunction tf = (TraitFunction) trait; + ret.append("trait function "); + ret.append(constants.multinameToString(tf.name_index)); + ret.append(" slotid "); + ret.append(tf.slot_index); + ret.append("\n"); + } + if (trait instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) trait; + ret.append("trait "); + switch (tm.kindType) { + case Trait.TRAIT_METHOD: + ret.append("method "); + break; + case Trait.TRAIT_GETTER: + ret.append("getter "); + break; + case Trait.TRAIT_SETTER: + ret.append("setter "); + break; + } + ret.append(constants.multinameToString(tm.name_index)); + ret.append(" dispid "); + ret.append(tm.disp_id); + ret.append("\n"); + } } + if (info != null) { + ret.append("method\n"); + ret.append("name "); + ret.append(info.name_index == 0 ? "null" : "\"" + Helper.escapeString(info.getName(constants)) + "\""); + ret.append("\n"); + if (info.flagExplicit()) { + ret.append("flag EXPLICIT\n"); + } + if (info.flagHas_optional()) { + ret.append("flag HAS_OPTIONAL\n"); + } + if (info.flagHas_paramnames()) { + ret.append("flag HAS_PARAM_NAMES\n"); + } + if (info.flagIgnore_rest()) { + ret.append("flag IGNORE_REST\n"); + } + if (info.flagNeed_activation()) { + ret.append("flag NEED_ACTIVATION\n"); + } + if (info.flagNeed_arguments()) { + ret.append("flag NEED_ARGUMENTS\n"); + } + if (info.flagNeed_rest()) { + ret.append("flag NEED_REST\n"); + } + if (info.flagSetsdxns()) { + ret.append("flag SET_DXNS\n"); + } + for (int p : info.param_types) { + ret.append("param "); + ret.append(constants.multinameToString(p)); + ret.append("\n"); + } + if (info.flagHas_paramnames()) { + for (int n : info.paramNames) { + ret.append("paramname "); + ret.append("\""); + ret.append(constants.constant_string[n]); + ret.append("\""); + ret.append("\n"); + } + } + if (info.flagHas_optional()) { + for (ValueKind vk : info.optional) { + ret.append("optional "); + ret.append(vk.toString(constants)); + ret.append("\n"); + } + } + ret.append("returns "); + ret.append(constants.multinameToString(info.ret_type)); + ret.append("\n"); + } + ret.append("\n"); + ret.append("body\n"); + + ret.append("maxstack "); + ret.append(body.max_stack); + ret.append("\n"); + + ret.append("localcount "); + ret.append(body.max_regs); + ret.append("\n"); + + ret.append("initscopedepth "); + ret.append(body.init_scope_depth); + ret.append("\n"); + + ret.append("maxscopedepth "); + ret.append(body.max_scope_depth); + ret.append("\n"); + + List offsets = new ArrayList<>(); + for (int e = 0; e < body.exceptions.length; e++) { + ret.append("try"); + + ret.append(" from "); + ret.append("ofs"); + ret.append(Helper.formatAddress(body.exceptions[e].start)); + offsets.add((long) body.exceptions[e].start); + + ret.append(" to "); + ret.append("ofs"); + ret.append(Helper.formatAddress(body.exceptions[e].end)); + offsets.add((long) body.exceptions[e].end); + + ret.append(" target "); + ret.append("ofs"); + ret.append(Helper.formatAddress(body.exceptions[e].target)); + offsets.add((long) body.exceptions[e].target); + + ret.append(" type "); + ret.append(body.exceptions[e].type_index == 0 ? "null" : constants.constant_multiname[body.exceptions[e].type_index].toString(constants, new ArrayList())); + + ret.append(" name "); + ret.append(body.exceptions[e].name_index == 0 ? "null" : constants.constant_multiname[body.exceptions[e].name_index].toString(constants, new ArrayList())); + ret.append("\n"); + } + + ret.append("\n"); + ret.append("code\n"); + for (AVM2Instruction ins : code) { offsets.addAll(ins.getOffsets()); } @@ -758,17 +889,17 @@ public class AVM2Code implements Serializable { } else if (offsets.contains(ofs)) { ret.append("ofs" + Helper.formatAddress(ofs) + ":"); } - for (int e = 0; e < body.exceptions.length; e++) { - if (body.exceptions[e].start == ofs) { - ret.append("exceptionstart " + e + ":"); - } - if (body.exceptions[e].end == ofs) { - ret.append("exceptionend " + e + ":"); - } - if (body.exceptions[e].target == ofs) { - ret.append("exceptiontarget " + e + ":"); - } - } + /*for (int e = 0; e < body.exceptions.length; e++) { + if (body.exceptions[e].start == ofs) { + ret.append("exceptionstart " + e + ":"); + } + if (body.exceptions[e].end == ofs) { + ret.append("exceptionend " + e + ":"); + } + if (body.exceptions[e].target == ofs) { + ret.append("exceptiontarget " + e + ":"); + } + }*/ if (ins.replaceWith != null) { for (Object o : ins.replaceWith) { if (o instanceof Integer) { @@ -1519,8 +1650,8 @@ public class AVM2Code implements Serializable { return ret; } - public int removeTraps(ConstantPool constants, MethodBody body, ABC abc, int scriptIndex, int classIndex, boolean isStatic, String path) { - removeDeadCode(constants, body); + public int removeTraps(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, ABC abc, int scriptIndex, int classIndex, boolean isStatic, String path) { + removeDeadCode(constants, trait, info, body); List localData = new ArrayList<>(); localData.add((Boolean) isStatic); //isStatic localData.add((Integer) (classIndex)); //classIndex @@ -1542,9 +1673,9 @@ public class AVM2Code implements Serializable { localData.add(refs); localData.add(this); int ret = 0; - ret += removeTraps(constants, body, localData, new AVM2GraphSource(this, false, -1, -1, new HashMap(), new Stack(), abc, body, new HashMap(), new ArrayList(), new HashMap(), refs), 0, path, refs); - removeIgnored(constants, body); - removeDeadCode(constants, body); + ret += removeTraps(constants, trait, info, body, localData, new AVM2GraphSource(this, false, -1, -1, new HashMap(), new Stack(), abc, body, new HashMap(), new ArrayList(), new HashMap(), refs), 0, path, refs); + removeIgnored(constants, trait, info, body); + removeDeadCode(constants, trait, info, body); return ret; } @@ -1927,7 +2058,7 @@ public class AVM2Code implements Serializable { } - private void restoreControlFlowPass(ConstantPool constants, MethodBody body, boolean secondpass) { + private void restoreControlFlowPass(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, boolean secondpass) { try { HashMap> refs; int[] visited2 = new int[code.size()]; @@ -1956,9 +2087,9 @@ public class AVM2Code implements Serializable { invalidateCache(); try { List outputMap = new ArrayList<>(); - String src = toASMSource(constants, body, outputMap, false, false); + String src = toASMSource(constants, trait, info, body, outputMap, false, false); - AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, null, body); + AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, null, body, info); for (int i = 0; i < acode.code.size(); i++) { if (outputMap.size() > i) { int tpos = outputMap.get(i); @@ -1978,11 +2109,11 @@ public class AVM2Code implements Serializable { Logger.getLogger(AVM2Code.class.getName()).log(Level.FINE, null, ex); } invalidateCache(); - removeDeadCode(constants, body); + removeDeadCode(constants, trait, info, body); } - public void restoreControlFlow(ConstantPool constants, MethodBody body) { - restoreControlFlowPass(constants, body, false); + public void restoreControlFlow(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) { + restoreControlFlowPass(constants, trait, info, body, false); //restoreControlFlowPass(constants, body, true); } @@ -1993,11 +2124,11 @@ public class AVM2Code implements Serializable { } } }*/ - public void removeIgnored(ConstantPool constants, MethodBody body) { + public void removeIgnored(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) { try { List outputMap = new ArrayList<>(); - String src = toASMSource(constants, body, outputMap, false, false); - AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, body); + String src = toASMSource(constants, trait, info, body, outputMap, false, false); + AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(src.getBytes("UTF-8")), constants, trait, body, info); for (int i = 0; i < acode.code.size(); i++) { if (outputMap.size() > i) { int tpos = outputMap.get(i); @@ -2015,7 +2146,7 @@ public class AVM2Code implements Serializable { invalidateCache(); } - public int removeDeadCode(ConstantPool constants, MethodBody body) { + public int removeDeadCode(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body) { HashMap> refs = visitCode(body); int cnt = 0; @@ -2027,7 +2158,7 @@ public class AVM2Code implements Serializable { } } - removeIgnored(constants, body); + removeIgnored(constants, trait, info, body); for (int i = code.size() - 1; i >= 0; i--) { AVM2Instruction ins = code.get(i); if (ins.definition instanceof JumpIns) { @@ -2038,7 +2169,7 @@ public class AVM2Code implements Serializable { } } } - removeIgnored(constants, body); + removeIgnored(constants, trait, info, body); return cnt; } @@ -2476,7 +2607,7 @@ public class AVM2Code implements Serializable { return ret; } - public static int removeTraps(ConstantPool constants, MethodBody body, List localData, AVM2GraphSource code, int addr, String path, HashMap> refs) { + public static int removeTraps(ConstantPool constants, Trait trait, MethodInfo info, MethodBody body, List localData, AVM2GraphSource code, int addr, String path, HashMap> refs) { HashMap decisions = new HashMap<>(); removeTraps(refs, false, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), new HashMap(), new HashMap>(), decisions, path); int cnt = 0; @@ -2503,7 +2634,7 @@ public class AVM2Code implements Serializable { } } //int cnt = removeTraps(refs, true, false, localData, new Stack(), new ArrayList(), code, code.adr2pos(addr), new HashMap(), new HashMap>(), decisions, path); - code.getCode().removeIgnored(constants, body); + code.getCode().removeIgnored(constants, trait, info, body); return cnt; } /*public static int removeTraps(List localData, AVM2GraphSource code, int addr) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java index 6f1d86998..f1025ecfa 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/ConstantPool.java @@ -46,6 +46,24 @@ public class ConstantPool { return constant_int.length - 1; } + public int addNamespace(Namespace ns) { + constant_namespace = Arrays.copyOf(constant_namespace, constant_namespace.length + 1); + constant_namespace[constant_namespace.length - 1] = ns; + return constant_namespace.length - 1; + } + + public int addNamespaceSet(NamespaceSet nss) { + constant_namespace_set = Arrays.copyOf(constant_namespace_set, constant_namespace_set.length + 1); + constant_namespace_set[constant_namespace_set.length - 1] = nss; + return constant_namespace_set.length - 1; + } + + public int addMultiname(Multiname m) { + constant_multiname = Arrays.copyOf(constant_multiname, constant_multiname.length + 1); + constant_multiname[constant_multiname.length - 1] = m; + return constant_multiname.length - 1; + } + public int addUInt(long value) { constant_uint = Arrays.copyOf(constant_uint, constant_uint.length + 1); constant_uint[constant_uint.length - 1] = value; @@ -164,4 +182,25 @@ public class ConstantPool { output.println("Multiname[" + i + "]=" + constant_multiname[i].toString(this, new ArrayList())); } } + + public String multinameToString(int index) { + if (index == 0) { + return "null"; + } + return constant_multiname[index].toString(this, new ArrayList()); + } + + public String namespaceToString(int index) { + if (index == 0) { + return "null"; + } + return constant_namespace[index].toString(this); + } + + public String namespaceSetToString(int index) { + if (index == 0) { + return "null"; + } + return constant_namespace_set[index].toString(this); + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java index ed4559b31..492c38452 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java @@ -171,15 +171,21 @@ public class AVM2Instruction implements Serializable, GraphSourceItem { for (int i = 0; i < definition.operands.length; i++) { switch (definition.operands[i]) { case AVM2Code.DAT_MULTINAME_INDEX: - s.append(" m["); - s.append(operands[i]); - s.append("]\""); - if (constants.constant_multiname[operands[i]] == null) { - s.append(""); + if (operands[i] == 0) { + s.append(" null"); } else { - s.append(Helper.escapeString(constants.constant_multiname[operands[i]].toString(constants, fullyQualifiedNames))); + s.append(" "); + s.append(constants.constant_multiname[operands[i]].toString(constants, fullyQualifiedNames)); } - s.append("\""); + /*s.append(" m["); + s.append(operands[i]); + s.append("]\""); + if (constants.constant_multiname[operands[i]] == null) { + s.append(""); + } else { + s.append(Helper.escapeString(constants.constant_multiname[operands[i]].toString(constants, fullyQualifiedNames))); + } + s.append("\"");*/ break; case AVM2Code.DAT_STRING_INDEX: s.append(" \""); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java index 0ebdacffc..affb70867 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/construction/NewFunctionIns.java @@ -46,7 +46,7 @@ public class NewFunctionIns extends InstructionDefinition { String paramStr = ""; if (mybody != null) { try { - bodyStr = Highlighting.hilighMethodEnd() + mybody.toString(path + "/inner", false, isStatic, scriptIndex, classIndex, abc, constants, method_info, new Stack()/*scopeStack*/, false, true, false, fullyQualifiedNames, null) + Highlighting.hilighMethodBegin(body.method_info); + bodyStr = Highlighting.hilighMethodEnd() + mybody.toString(path + "/inner", false, isStatic, scriptIndex, classIndex, abc, null, constants, method_info, new Stack()/*scopeStack*/, false, true, false, fullyQualifiedNames, null) + Highlighting.hilighMethodBegin(body.method_info); } catch (Exception ex) { Logger.getLogger(NewFunctionIns.class.getName()).log(Level.SEVERE, "error during newfunction", ex); } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java index d81f4411f..6f0e9a878 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ASM3Parser.java @@ -23,12 +23,25 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.DeobfuscatePopIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.types.ABCException; import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.Namespace; +import com.jpexs.decompiler.flash.abc.types.NamespaceSet; +import com.jpexs.decompiler.flash.abc.types.ValueKind; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitFunction; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.logging.Level; +import java.util.logging.Logger; public class ASM3Parser { @@ -63,8 +76,8 @@ public class ASM3Parser { } } - public static AVM2Code parse(InputStream is, ConstantPool constants, MethodBody body) throws IOException, ParseException { - return parse(is, constants, null, body); + public static AVM2Code parse(InputStream is, ConstantPool constants, Trait trait, MethodBody body, MethodInfo info) throws IOException, ParseException { + return parse(is, constants, trait, null, body, info); } private static int checkMultinameIndex(ConstantPool constants, int index, int line) throws ParseException { @@ -74,7 +87,390 @@ public class ASM3Parser { return index; } - public static AVM2Code parse(InputStream is, ConstantPool constants, MissingSymbolHandler missingHandler, MethodBody body) throws IOException, ParseException { + private static void expected(int type, String expStr, Flasm3Lexer lexer) throws IOException, ParseException { + ParsedSymbol s = lexer.lex(); + if (s.type != type) { + throw new ParseException(expStr + " expected", lexer.yyline()); + } + } + + private static void expected(ParsedSymbol s, int type, String expStr) throws IOException, ParseException { + if (s.type != type) { + throw new ParseException(expStr + " expected", 0); + } + } + + public static boolean parseSlotConst(InputStream is, ConstantPool constants, TraitSlotConst tsc) throws IOException, ParseException { + Flasm3Lexer lexer = null; + try { + lexer = new Flasm3Lexer(new InputStreamReader(is, "UTF-8")); + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(ASM3Parser.class.getName()).log(Level.SEVERE, null, ex); + return false; + } + expected(ParsedSymbol.TYPE_KEYWORD_TRAIT, "trait", lexer); + int name_index = parseMultiName(constants, lexer); + + ParsedSymbol symb = lexer.lex(); + + + int flags = 0; + while (symb.type == ParsedSymbol.TYPE_KEYWORD_FLAG) { + symb = lexer.lex(); + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_FINAL: + flags |= Trait.ATTR_Final; + break; + case ParsedSymbol.TYPE_KEYWORD_OVERRIDE: + flags |= Trait.ATTR_Override; + break; + case ParsedSymbol.TYPE_KEYWORD_METADATA: + flags |= Trait.ATTR_Metadata; + break; + default: + throw new ParseException("Invalid trait flag", lexer.yyline()); + } + symb = lexer.lex(); + } + + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_SLOT: + case ParsedSymbol.TYPE_KEYWORD_CONST: + expected(ParsedSymbol.TYPE_KEYWORD_SLOTID, "slotid", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + int slotid = (int) (long) (Long) symb.value; + expected(ParsedSymbol.TYPE_KEYWORD_TYPE, "type", lexer); + int type = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_KEYWORD_VALUE, "value", lexer); + ValueKind val = parseValue(constants, lexer); + tsc.slot_id = slotid; + tsc.type_index = type; + tsc.value_kind = val.value_kind; + tsc.value_index = val.value_index; + tsc.kindFlags = flags; + break; + /*case ParsedSymbol.TYPE_KEYWORD_CLASS: + break; + case ParsedSymbol.TYPE_KEYWORD_FUNCTION: + break; + case ParsedSymbol.TYPE_KEYWORD_METHOD: + case ParsedSymbol.TYPE_KEYWORD_GETTER: + case ParsedSymbol.TYPE_KEYWORD_SETTER: + break;*/ + default: + throw new ParseException("Unexpected trait type", lexer.yyline()); + } + tsc.name_index = name_index; + return true; + } + + private static int parseNamespaceSet(ConstantPool constants, Flasm3Lexer lexer) throws ParseException, IOException { + List namespaceList = new ArrayList<>(); + ParsedSymbol s = lexer.lex(); + if (s.type == ParsedSymbol.TYPE_KEYWORD_NULL) { + return 0; + } + expected(s, ParsedSymbol.TYPE_BRACKET_OPEN, "["); + s = lexer.lex(); + if (s.type != ParsedSymbol.TYPE_BRACKET_CLOSE) { + lexer.pushback(s); + do { + namespaceList.add(parseNamespace(constants, lexer)); + s = lexer.lex(); + } while (s.type == ParsedSymbol.TYPE_COMMA); + expected(s, ParsedSymbol.TYPE_BRACKET_CLOSE, "]"); + } + loopn: + for (int n = 1; n < constants.constant_namespace_set.length; n++) { + int nss[] = constants.constant_namespace_set[n].namespaces; + if (nss.length != namespaceList.size()) { + continue; + } + for (int i = 0; i < nss.length; i++) { + if (nss[i] != namespaceList.get(i)) { + continue loopn; + } + } + return n; + } + int nss[] = new int[namespaceList.size()]; + for (int i = 0; i < nss.length; i++) { + nss[i] = namespaceList.get(i); + } + return constants.addNamespaceSet(new NamespaceSet(nss)); + } + + private static int parseNamespace(ConstantPool constants, Flasm3Lexer lexer) throws ParseException, IOException { + + ParsedSymbol type = lexer.lex(); + int kind = 0; + switch (type.type) { + case ParsedSymbol.TYPE_KEYWORD_NULL: + return 0; + case ParsedSymbol.TYPE_KEYWORD_NAMESPACE: + kind = Namespace.KIND_NAMESPACE; + break; + case ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE: + kind = Namespace.KIND_PRIVATE; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE: + kind = Namespace.KIND_PACKAGE; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS: + kind = Namespace.KIND_PACKAGE_INTERNAL; + break; + case ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE: + kind = Namespace.KIND_PROTECTED; + break; + case ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE: + kind = Namespace.KIND_EXPLICIT; + break; + case ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS: + kind = Namespace.KIND_STATIC_PROTECTED; + break; + default: + throw new ParseException("Namespace kind expected", lexer.yyline()); + } + + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + ParsedSymbol name = lexer.lex(); + expected(name, ParsedSymbol.TYPE_STRING, "String"); + ParsedSymbol c = lexer.lex(); + int index = 0; + if (c.type == ParsedSymbol.TYPE_COMMA) { + ParsedSymbol extra = lexer.lex(); + expected(name, ParsedSymbol.TYPE_STRING, "String"); + try { + index = Integer.parseInt((String) extra.value); + } catch (NumberFormatException nfe) { + throw new ParseException("Number expected", lexer.yyline()); + } + } else { + lexer.pushback(c); + } + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + + for (int n = 1; n < constants.constant_namespace.length; n++) { + Namespace ns = constants.constant_namespace[n]; + if (ns.getName(constants).equals(name.value) && (ns.kind == kind)) { + if (index == 0) { + return n; + } + index--; + } + } + return constants.addNamespace(new Namespace(kind, constants.forceGetStringId((String) name.value))); + } + + private static int parseMultiName(ConstantPool constants, Flasm3Lexer lexer) throws ParseException, IOException { + ParsedSymbol s = lexer.lex(); + int kind = 0; + int name_index = -1; + int namespace_index = -1; + int namespace_set_index = -1; + int qname_index = -1; + List params = new ArrayList<>(); + + switch (s.type) { + case ParsedSymbol.TYPE_KEYWORD_NULL: + return 0; + case ParsedSymbol.TYPE_KEYWORD_QNAME: + kind = Multiname.QNAME; + break; + case ParsedSymbol.TYPE_KEYWORD_QNAMEA: + kind = Multiname.QNAMEA; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAME: + kind = Multiname.RTQNAME; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEA: + kind = Multiname.RTQNAMEA; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEL: + kind = Multiname.RTQNAMEL; + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMELA: + kind = Multiname.RTQNAMELA; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAME: + kind = Multiname.MULTINAME; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEA: + kind = Multiname.MULTINAMEA; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEL: + kind = Multiname.MULTINAMEL; + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMELA: + kind = Multiname.MULTINAMELA; + break; + case ParsedSymbol.TYPE_KEYWORD_TYPENAME: + kind = Multiname.TYPENAME; + break; + default: + throw new ParseException("Name expected", lexer.yyline()); + } + + switch (s.type) { + case ParsedSymbol.TYPE_KEYWORD_QNAME: + case ParsedSymbol.TYPE_KEYWORD_QNAMEA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + namespace_index = parseNamespace(constants, lexer); + expected(ParsedSymbol.TYPE_COMMA, ",", lexer); + ParsedSymbol name = lexer.lex(); + expected(name, ParsedSymbol.TYPE_STRING, "String"); + name_index = constants.forceGetStringId((String) name.value); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAME: + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + ParsedSymbol rtqName = lexer.lex(); + expected(rtqName, ParsedSymbol.TYPE_STRING, "String"); + name_index = constants.forceGetStringId((String) rtqName.value); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_RTQNAMEL: + case ParsedSymbol.TYPE_KEYWORD_RTQNAMELA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAME: + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + ParsedSymbol mName = lexer.lex(); + expected(mName, ParsedSymbol.TYPE_STRING, "String"); + name_index = constants.forceGetStringId((String) mName.value); + expected(ParsedSymbol.TYPE_COMMA, ",", lexer); + namespace_set_index = parseNamespaceSet(constants, lexer); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_MULTINAMEL: + case ParsedSymbol.TYPE_KEYWORD_MULTINAMELA: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + namespace_set_index = parseNamespaceSet(constants, lexer); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + case ParsedSymbol.TYPE_KEYWORD_TYPENAME: + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + qname_index = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_LOWERTHAN, "<", lexer); + params.add(parseMultiName(constants, lexer)); + ParsedSymbol nt = lexer.lex(); + while (nt.type == ParsedSymbol.TYPE_COMMA) { + params.add(parseMultiName(constants, lexer)); + nt = lexer.lex(); + } + expected(nt, ParsedSymbol.TYPE_GREATERTHAN, ">"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + break; + } + loopm: + for (int m = 1; m < constants.constant_multiname.length; m++) { + Multiname mul = constants.constant_multiname[m]; + if (mul.kind == kind && mul.name_index == name_index && mul.namespace_index == namespace_index && mul.namespace_set_index == namespace_set_index && mul.qname_index == qname_index && mul.params.size() == params.size()) { + for (int p = 0; p < mul.params.size(); p++) { + if (mul.params.get(p) != params.get(p)) { + continue loopm; + } + } + return m; + } + + } + return constants.addMultiname(new Multiname(kind, name_index, namespace_index, namespace_set_index, qname_index, params)); + } + + public static ValueKind parseValue(ConstantPool constants, Flasm3Lexer lexer) throws IOException, ParseException { + ParsedSymbol type = lexer.lex(); + ParsedSymbol value; + int value_index = 0; + int value_kind = 0; + switch (type.type) { + case ParsedSymbol.TYPE_KEYWORD_INTEGER: + value_kind = ValueKind.CONSTANT_Int; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_INTEGER, "Integer"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetIntId((Long) value.value); + break; + case ParsedSymbol.TYPE_KEYWORD_UINTEGER: + value_kind = ValueKind.CONSTANT_UInt; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_INTEGER, "UInteger"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetUIntId((Long) value.value); + break; + case ParsedSymbol.TYPE_KEYWORD_DOUBLE: + value_kind = ValueKind.CONSTANT_Double; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_FLOAT, "Double"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetDoubleId((Double) value.value); + break; + /*case ParsedSymbol.TYPE_KEYWORD_DECIMAL: + value_kind = ValueKind.CONSTANT_Decimal; + break;*/ + case ParsedSymbol.TYPE_KEYWORD_UTF8: + value_kind = ValueKind.CONSTANT_Utf8; + expected(ParsedSymbol.TYPE_PARENT_OPEN, "(", lexer); + value = lexer.lex(); + expected(value, ParsedSymbol.TYPE_STRING, "String"); + expected(ParsedSymbol.TYPE_PARENT_CLOSE, ")", lexer); + value_index = constants.forceGetStringId((String) value.value); + break; + case ParsedSymbol.TYPE_KEYWORD_TRUE: + value_kind = ValueKind.CONSTANT_True; + break; + case ParsedSymbol.TYPE_KEYWORD_FALSE: + value_kind = ValueKind.CONSTANT_False; + break; + case ParsedSymbol.TYPE_KEYWORD_NULL: + value_kind = ValueKind.CONSTANT_Null; + break; + case ParsedSymbol.TYPE_KEYWORD_NAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS: + case ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS: + case ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE: + case ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE: + + switch (type.type) { + case ParsedSymbol.TYPE_KEYWORD_NAMESPACE: + value_kind = ValueKind.CONSTANT_Namespace; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS: + value_kind = ValueKind.CONSTANT_PackageInternalNs; + break; + case ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE: + value_kind = ValueKind.CONSTANT_ProtectedNamespace; + break; + case ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE: + value_kind = ValueKind.CONSTANT_ExplicitNamespace; + break; + case ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS: + value_kind = ValueKind.CONSTANT_StaticProtectedNs; + break; + case ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE: + value_kind = ValueKind.CONSTANT_PrivateNs; + break; + case ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE: + value_kind = ValueKind.CONSTANT_PackageNamespace; + break; + } + lexer.pushback(type); + value_index = parseNamespace(constants, lexer); + break; + } + return new ValueKind(value_index, value_kind); + } + + public static AVM2Code parse(InputStream is, ConstantPool constants, Trait trait, MissingSymbolHandler missingHandler, MethodBody body, MethodInfo info) throws IOException, ParseException { AVM2Code code = new AVM2Code(); List offsetItems = new ArrayList<>(); @@ -83,12 +479,170 @@ public class ASM3Parser { List exceptionIndices = new ArrayList<>(); int offset = 0; + Flasm3Lexer lexer = new Flasm3Lexer(new InputStreamReader(is, "UTF-8")); ParsedSymbol symb; AVM2Instruction lastIns = null; + List exceptionsFrom = new ArrayList<>(); + List exceptionsTo = new ArrayList<>(); + List exceptionsTargets = new ArrayList<>(); + info.flags = 0; + info.name_index = 0; + List paramTypes = new ArrayList<>(); + List paramNames = new ArrayList<>(); + List optional = new ArrayList<>(); do { - symb = lexer.yylex(); + symb = lexer.lex(); + if (Arrays.asList(ParsedSymbol.TYPE_KEYWORD_BODY, ParsedSymbol.TYPE_KEYWORD_CODE, ParsedSymbol.TYPE_KEYWORD_METHOD).contains(symb.type)) { + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_TRAIT) { + if (trait == null) { + throw new ParseException("No trait expected", lexer.yyline()); + } + symb = lexer.lex(); + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_METHOD: + case ParsedSymbol.TYPE_KEYWORD_GETTER: + case ParsedSymbol.TYPE_KEYWORD_SETTER: + if (!(trait instanceof TraitMethodGetterSetter)) { + throw new ParseException("Unxpected trait type", lexer.yyline()); + } + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) trait; + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_METHOD: + tm.kindType = Trait.TRAIT_METHOD; + break; + case ParsedSymbol.TYPE_KEYWORD_GETTER: + tm.kindType = Trait.TRAIT_GETTER; + break; + case ParsedSymbol.TYPE_KEYWORD_SETTER: + tm.kindType = Trait.TRAIT_SETTER; + break; + } + tm.name_index = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_KEYWORD_DISPID, "dispid", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + tm.disp_id = (int) (long) (Long) symb.value; + + break; + case ParsedSymbol.TYPE_KEYWORD_FUNCTION: + if (!(trait instanceof TraitFunction)) { + throw new ParseException("Unxpected trait type", lexer.yyline()); + } + break; + + } + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_NAME) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_STRING, "String"); + info.name_index = constants.forceGetStringId((String) symb.value); + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_PARAM) { + paramTypes.add(parseMultiName(constants, lexer)); + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_PARAMNAME) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_STRING, "String"); + paramNames.add(constants.forceGetStringId((String) symb.value)); + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_OPTIONAL) { + optional.add(parseValue(constants, lexer)); + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_MAXSTACK) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.max_stack = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_LOCALCOUNT) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.max_regs = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_INITSCOPEDEPTH) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.init_scope_depth = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_MAXSCOPEDEPTH) { + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_INTEGER, "Integer"); + body.max_scope_depth = (int) (long) (Long) symb.value; + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_RETURNS) { + info.ret_type = parseMultiName(constants, lexer); + continue; + } + + if (symb.type == ParsedSymbol.TYPE_KEYWORD_FLAG) { + symb = lexer.lex(); + switch (symb.type) { + case ParsedSymbol.TYPE_KEYWORD_EXPLICIT: + info.setFlagExplicit(); + break; + case ParsedSymbol.TYPE_KEYWORD_HAS_OPTIONAL: + info.setFlagHas_optional(); + break; + case ParsedSymbol.TYPE_KEYWORD_HAS_PARAM_NAMES: + info.setFlagHas_paramnames(); + break; + case ParsedSymbol.TYPE_KEYWORD_IGNORE_REST: + info.setFlagIgnore_Rest(); + break; + case ParsedSymbol.TYPE_KEYWORD_NEED_ACTIVATION: + info.setFlagNeed_activation(); + break; + case ParsedSymbol.TYPE_KEYWORD_NEED_ARGUMENTS: + info.setFlagNeed_Arguments(); + break; + case ParsedSymbol.TYPE_KEYWORD_NEED_REST: + info.setFlagNeed_rest(); + break; + case ParsedSymbol.TYPE_KEYWORD_SET_DXNS: + info.setFlagSetsdxns(); + break; + } + continue; + } + if (symb.type == ParsedSymbol.TYPE_KEYWORD_TRY) { + expected(ParsedSymbol.TYPE_KEYWORD_FROM, "From", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_IDENTIFIER, "Identifier"); + exceptionsFrom.add((String) symb.value); + expected(ParsedSymbol.TYPE_KEYWORD_TO, "To", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_IDENTIFIER, "Identifier"); + exceptionsTo.add((String) symb.value); + expected(ParsedSymbol.TYPE_KEYWORD_TARGET, "Target", lexer); + symb = lexer.lex(); + expected(symb, ParsedSymbol.TYPE_IDENTIFIER, "Identifier"); + exceptionsTargets.add((String) symb.value); + expected(ParsedSymbol.TYPE_KEYWORD_TYPE, "Type", lexer); + ABCException ex = new ABCException(); + ex.type_index = parseMultiName(constants, lexer); + expected(ParsedSymbol.TYPE_KEYWORD_NAME, "Name", lexer); + ex.name_index = parseMultiName(constants, lexer); + exceptions.add(ex); + continue; + } if (symb.type == ParsedSymbol.TYPE_EXCEPTION_START) { int exIndex = (Integer) symb.value; int listIndex = exceptionIndices.indexOf(exIndex); @@ -127,15 +681,15 @@ public class ASM3Parser { } if (symb.type == ParsedSymbol.TYPE_INSTRUCTION_NAME) { if (((String) symb.value).toLowerCase(Locale.ENGLISH).equals("exception")) { - ParsedSymbol exIndex = lexer.yylex(); + ParsedSymbol exIndex = lexer.lex(); if (exIndex.type != ParsedSymbol.TYPE_INTEGER) { throw new ParseException("Index expected", lexer.yyline()); } - ParsedSymbol exName = lexer.yylex(); + ParsedSymbol exName = lexer.lex(); if (exName.type != ParsedSymbol.TYPE_MULTINAME) { throw new ParseException("Multiname expected", lexer.yyline()); } - ParsedSymbol exType = lexer.yylex(); + ParsedSymbol exType = lexer.lex(); if (exType.type != ParsedSymbol.TYPE_MULTINAME) { throw new ParseException("Multiname expected", lexer.yyline()); } @@ -154,14 +708,16 @@ public class ASM3Parser { List operandsList = new ArrayList<>(); for (int i = 0; i < def.operands.length; i++) { - ParsedSymbol parsedOperand = lexer.yylex(); + ParsedSymbol parsedOperand = lexer.lex(); switch (def.operands[i]) { case AVM2Code.DAT_MULTINAME_INDEX: - if (parsedOperand.type == ParsedSymbol.TYPE_MULTINAME) { - operandsList.add(checkMultinameIndex(constants, (int) (long) (Long) parsedOperand.value, lexer.yyline())); - } else { - throw new ParseException("Multiname expected", lexer.yyline()); - } + lexer.pushback(parsedOperand); + operandsList.add(parseMultiName(constants, lexer)); + /*if (parsedOperand.type == ParsedSymbol.TYPE_MULTINAME) { + operandsList.add(checkMultinameIndex(constants, (int) (long) (Long) parsedOperand.value, lexer.yyline())); + } else { + throw new ParseException("Multiname expected", lexer.yyline()); + }*/ break; case AVM2Code.DAT_STRING_INDEX: if (parsedOperand.type == ParsedSymbol.TYPE_STRING) { @@ -257,7 +813,7 @@ public class ASM3Parser { operandsList.add(patCount); for (int c = 0; c <= patCount; c++) { - parsedOperand = lexer.yylex(); + parsedOperand = lexer.lex(); if (parsedOperand.type == ParsedSymbol.TYPE_IDENTIFIER) { offsetItems.add(new CaseOffsetItem((String) parsedOperand.value, code.code.size(), i + (c + 1))); operandsList.add(0); @@ -306,6 +862,23 @@ public class ASM3Parser { } while (symb.type != ParsedSymbol.TYPE_EOF); code.compact(); + for (LabelItem li : labelItems) { + int ind; + ind = exceptionsFrom.indexOf(li.label); + if (ind > -1) { + exceptions.get(ind).start = li.offset; + } + + ind = exceptionsTo.indexOf(li.label); + if (ind > -1) { + exceptions.get(ind).end = li.offset; + } + + ind = exceptionsTargets.indexOf(li.label); + if (ind > -1) { + exceptions.get(ind).target = li.offset; + } + } for (OffsetItem oi : offsetItems) { for (LabelItem li : labelItems) { @@ -325,6 +898,25 @@ public class ASM3Parser { for (int e = 0; e < exceptions.size(); e++) { body.exceptions[e] = exceptions.get(e); } + + info.param_types = new int[paramTypes.size()]; + for (int i = 0; i < paramTypes.size(); i++) { + info.param_types[i] = paramTypes.get(i); + } + + if (info.flagHas_paramnames()) { + info.paramNames = new int[paramNames.size()]; + for (int i = 0; i < paramNames.size(); i++) { + info.paramNames[i] = paramNames.get(i); + } + } + + if (info.flagHas_optional()) { + info.optional = new ValueKind[optional.size()]; + for (int i = 0; i < optional.size(); i++) { + info.optional[i] = optional.get(i); + } + } return code; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java index 9229c9bac..5eaa2c27e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/Flasm3Lexer.java @@ -1,25 +1,15 @@ -/* - * Copyright (C) 2010-2013 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ +/* The following code was generated by JFlex 1.4.3 on 11.9.13 21:54 */ + +/* Flash assembler language lexer specification */ package com.jpexs.decompiler.flash.abc.avm2.parser; +import java.util.Stack; + /** - * This class is a scanner generated by JFlex - * 1.4.3 on 19.9.10 10:36 from the specification file - * D:/Dokumenty/Programovani/JavaSE/ASDec/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex + * This class is a scanner generated by + * JFlex 1.4.3 on 11.9.13 21:54 from the + * specification file + * D:/Dropbox/Programovani/JavaSE/FFDec/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex */ public final class Flasm3Lexer { @@ -49,93 +39,119 @@ public final class Flasm3Lexer { * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = - "\11\12\1\4\1\2\1\0\1\4\1\1\16\12\4\0\1\40\1\0" - + "\1\43\1\0\1\11\2\0\1\46\3\0\1\23\1\0\1\17\1\20" - + "\1\0\1\16\3\47\4\24\2\7\1\15\1\3\5\0\4\11\1\21" - + "\25\11\1\6\1\25\1\10\1\0\1\14\1\0\1\36\1\44\1\27" - + "\1\41\1\22\1\45\1\42\1\13\1\32\3\13\1\5\1\34\1\33" - + "\1\30\1\13\1\37\1\35\1\31\3\13\1\26\2\13\4\0\41\12" - + "\2\0\4\11\4\0\1\11\2\0\1\12\7\0\1\11\4\0\1\11" - + "\5\0\27\11\1\0\37\11\1\0\u013f\11\31\0\162\11\4\0\14\11" - + "\16\0\5\11\11\0\1\11\21\0\130\12\5\0\23\12\12\0\1\11" - + "\13\0\1\11\1\0\3\11\1\0\1\11\1\0\24\11\1\0\54\11" - + "\1\0\46\11\1\0\5\11\4\0\202\11\1\0\4\12\3\0\105\11" - + "\1\0\46\11\2\0\2\11\6\0\20\11\41\0\46\11\2\0\1\11" - + "\7\0\47\11\11\0\21\12\1\0\27\12\1\0\3\12\1\0\1\12" - + "\1\0\2\12\1\0\1\12\13\0\33\11\5\0\3\11\15\0\4\12" - + "\14\0\6\12\13\0\32\11\5\0\13\11\16\12\7\0\12\12\4\0" - + "\2\11\1\12\143\11\1\0\1\11\10\12\1\0\6\12\2\11\2\12" - + "\1\0\4\12\2\11\12\12\3\11\2\0\1\11\17\0\1\12\1\11" - + "\1\12\36\11\33\12\2\0\3\11\60\0\46\11\13\12\1\11\u014f\0" - + "\3\12\66\11\2\0\1\12\1\11\20\12\2\0\1\11\4\12\3\0" - + "\12\11\2\12\2\0\12\12\21\0\3\12\1\0\10\11\2\0\2\11" - + "\2\0\26\11\1\0\7\11\1\0\1\11\3\0\4\11\2\0\1\12" - + "\1\11\7\12\2\0\2\12\2\0\3\12\11\0\1\12\4\0\2\11" - + "\1\0\3\11\2\12\2\0\12\12\4\11\15\0\3\12\1\0\6\11" - + "\4\0\2\11\2\0\26\11\1\0\7\11\1\0\2\11\1\0\2\11" - + "\1\0\2\11\2\0\1\12\1\0\5\12\4\0\2\12\2\0\3\12" - + "\13\0\4\11\1\0\1\11\7\0\14\12\3\11\14\0\3\12\1\0" - + "\11\11\1\0\3\11\1\0\26\11\1\0\7\11\1\0\2\11\1\0" - + "\5\11\2\0\1\12\1\11\10\12\1\0\3\12\1\0\3\12\2\0" - + "\1\11\17\0\2\11\2\12\2\0\12\12\1\0\1\11\17\0\3\12" - + "\1\0\10\11\2\0\2\11\2\0\26\11\1\0\7\11\1\0\2\11" - + "\1\0\5\11\2\0\1\12\1\11\6\12\3\0\2\12\2\0\3\12" - + "\10\0\2\12\4\0\2\11\1\0\3\11\4\0\12\12\1\0\1\11" - + "\20\0\1\12\1\11\1\0\6\11\3\0\3\11\1\0\4\11\3\0" - + "\2\11\1\0\1\11\1\0\2\11\3\0\2\11\3\0\3\11\3\0" - + "\10\11\1\0\3\11\4\0\5\12\3\0\3\12\1\0\4\12\11\0" - + "\1\12\17\0\11\12\11\0\1\11\7\0\3\12\1\0\10\11\1\0" - + "\3\11\1\0\27\11\1\0\12\11\1\0\5\11\4\0\7\12\1\0" - + "\3\12\1\0\4\12\7\0\2\12\11\0\2\11\4\0\12\12\22\0" + "\11\12\1\4\1\2\1\0\1\4\1\1\16\12\4\0\1\53\1\0" + + "\1\76\1\0\1\11\2\0\1\111\1\101\1\102\1\0\1\24\1\107" + + "\1\20\1\21\1\0\1\17\3\112\4\25\1\110\1\7\1\16\1\3" + + "\1\103\1\0\1\104\2\0\1\47\1\70\1\31\1\54\1\22\1\62" + + "\1\56\1\74\1\37\1\11\1\72\1\64\1\5\1\43\1\41\1\33" + + "\1\77\1\51\1\45\1\35\1\66\1\105\1\11\1\27\1\60\1\11" + + "\1\6\1\26\1\10\1\0\1\15\1\0\1\50\1\71\1\32\1\55" + + "\1\23\1\63\1\57\1\75\1\40\1\14\1\73\1\65\1\13\1\44" + + "\1\42\1\34\1\100\1\52\1\46\1\36\1\67\1\106\1\14\1\30" + + "\1\61\1\14\4\0\41\12\2\0\4\11\4\0\1\11\2\0\1\12" + + "\7\0\1\11\4\0\1\11\5\0\27\11\1\0\37\11\1\0\u01ca\11" + + "\4\0\14\11\16\0\5\11\7\0\1\11\1\0\1\11\21\0\160\12" + + "\5\11\1\0\2\11\2\0\4\11\10\0\1\11\1\0\3\11\1\0" + + "\1\11\1\0\24\11\1\0\123\11\1\0\213\11\1\0\5\12\2\0" + + "\236\11\11\0\46\11\2\0\1\11\7\0\47\11\11\0\55\12\1\0" + + "\1\12\1\0\2\12\1\0\2\12\1\0\1\12\10\0\33\11\5\0" + + "\3\11\15\0\4\12\7\0\1\11\4\0\13\12\5\0\53\11\37\12" + + "\4\0\2\11\1\12\143\11\1\0\1\11\10\12\1\0\6\12\2\11" + + "\2\12\1\0\4\12\2\11\12\12\3\11\2\0\1\11\17\0\1\12" + + "\1\11\1\12\36\11\33\12\2\0\131\11\13\12\1\11\16\0\12\12" + + "\41\11\11\12\2\11\4\0\1\11\5\0\26\11\4\12\1\11\11\12" + + "\1\11\3\12\1\11\5\12\22\0\31\11\3\12\244\0\4\12\66\11" + + "\3\12\1\11\22\12\1\11\7\12\12\11\2\12\2\0\12\12\1\0" + + "\7\11\1\0\7\11\1\0\3\12\1\0\10\11\2\0\2\11\2\0" + + "\26\11\1\0\7\11\1\0\1\11\3\0\4\11\2\0\1\12\1\11" + + "\7\12\2\0\2\12\2\0\3\12\1\11\10\0\1\12\4\0\2\11" + + "\1\0\3\11\2\12\2\0\12\12\4\11\7\0\1\11\5\0\3\12" + + "\1\0\6\11\4\0\2\11\2\0\26\11\1\0\7\11\1\0\2\11" + + "\1\0\2\11\1\0\2\11\2\0\1\12\1\0\5\12\4\0\2\12" + + "\2\0\3\12\3\0\1\12\7\0\4\11\1\0\1\11\7\0\14\12" + + "\3\11\1\12\13\0\3\12\1\0\11\11\1\0\3\11\1\0\26\11" + + "\1\0\7\11\1\0\2\11\1\0\5\11\2\0\1\12\1\11\10\12" + + "\1\0\3\12\1\0\3\12\2\0\1\11\17\0\2\11\2\12\2\0" + + "\12\12\1\0\1\11\17\0\3\12\1\0\10\11\2\0\2\11\2\0" + + "\26\11\1\0\7\11\1\0\2\11\1\0\5\11\2\0\1\12\1\11" + + "\7\12\2\0\2\12\2\0\3\12\10\0\2\12\4\0\2\11\1\0" + + "\3\11\2\12\2\0\12\12\1\0\1\11\20\0\1\12\1\11\1\0" + + "\6\11\3\0\3\11\1\0\4\11\3\0\2\11\1\0\1\11\1\0" + + "\2\11\3\0\2\11\3\0\3\11\3\0\14\11\4\0\5\12\3\0" + + "\3\12\1\0\4\12\2\0\1\11\6\0\1\12\16\0\12\12\11\0" + + "\1\11\7\0\3\12\1\0\10\11\1\0\3\11\1\0\27\11\1\0" + + "\12\11\1\0\5\11\3\0\1\11\7\12\1\0\3\12\1\0\4\12" + + "\7\0\2\12\1\0\2\11\6\0\2\11\2\12\2\0\12\12\22\0" + "\2\12\1\0\10\11\1\0\3\11\1\0\27\11\1\0\12\11\1\0" + "\5\11\2\0\1\12\1\11\7\12\1\0\3\12\1\0\4\12\7\0" - + "\2\12\7\0\1\11\1\0\2\11\4\0\12\12\22\0\2\12\1\0" - + "\10\11\1\0\3\11\1\0\27\11\1\0\20\11\4\0\6\12\2\0" - + "\3\12\1\0\4\12\11\0\1\12\10\0\2\11\4\0\12\12\22\0" - + "\2\12\1\0\22\11\3\0\30\11\1\0\11\11\1\0\1\11\2\0" - + "\7\11\3\0\1\12\4\0\6\12\1\0\1\12\1\0\10\12\22\0" - + "\2\12\15\0\60\11\1\12\2\11\7\12\4\0\10\11\10\12\1\0" - + "\12\12\47\0\2\11\1\0\1\11\2\0\2\11\1\0\1\11\2\0" - + "\1\11\6\0\4\11\1\0\7\11\1\0\3\11\1\0\1\11\1\0" - + "\1\11\2\0\2\11\1\0\4\11\1\12\2\11\6\12\1\0\2\12" - + "\1\11\2\0\5\11\1\0\1\11\1\0\6\12\2\0\12\12\2\0" - + "\2\11\42\0\1\11\27\0\2\12\6\0\12\12\13\0\1\12\1\0" - + "\1\12\1\0\1\12\4\0\2\12\10\11\1\0\42\11\6\0\24\12" - + "\1\0\2\12\4\11\4\0\10\12\1\0\44\12\11\0\1\12\71\0" - + "\42\11\1\0\5\11\1\0\2\11\1\0\7\12\3\0\4\12\6\0" - + "\12\12\6\0\6\11\4\12\106\0\46\11\12\0\51\11\7\0\132\11" - + "\5\0\104\11\5\0\122\11\6\0\7\11\1\0\77\11\1\0\1\11" - + "\1\0\4\11\2\0\7\11\1\0\1\11\1\0\4\11\2\0\47\11" - + "\1\0\1\11\1\0\4\11\2\0\37\11\1\0\1\11\1\0\4\11" - + "\2\0\7\11\1\0\1\11\1\0\4\11\2\0\7\11\1\0\7\11" - + "\1\0\27\11\1\0\37\11\1\0\1\11\1\0\4\11\2\0\7\11" - + "\1\0\47\11\1\0\23\11\16\0\11\12\56\0\125\11\14\0\u026c\11" - + "\2\0\10\11\12\0\32\11\5\0\113\11\3\0\3\11\17\0\15\11" + + "\2\12\7\0\1\11\1\0\2\11\2\12\2\0\12\12\1\0\2\11" + + "\17\0\2\12\1\0\10\11\1\0\3\11\1\0\51\11\2\0\1\11" + + "\7\12\1\0\3\12\1\0\4\12\1\11\10\0\1\12\10\0\2\11" + + "\2\12\2\0\12\12\12\0\6\11\2\0\2\12\1\0\22\11\3\0" + + "\30\11\1\0\11\11\1\0\1\11\2\0\7\11\3\0\1\12\4\0" + + "\6\12\1\0\1\12\1\0\10\12\22\0\2\12\15\0\60\11\1\12" + + "\2\11\7\12\4\0\10\11\10\12\1\0\12\12\47\0\2\11\1\0" + + "\1\11\2\0\2\11\1\0\1\11\2\0\1\11\6\0\4\11\1\0" + + "\7\11\1\0\3\11\1\0\1\11\1\0\1\11\2\0\2\11\1\0" + + "\4\11\1\12\2\11\6\12\1\0\2\12\1\11\2\0\5\11\1\0" + + "\1\11\1\0\6\12\2\0\12\12\2\0\2\11\42\0\1\11\27\0" + + "\2\12\6\0\12\12\13\0\1\12\1\0\1\12\1\0\1\12\4\0" + + "\2\12\10\11\1\0\44\11\4\0\24\12\1\0\2\12\5\11\13\12" + + "\1\0\44\12\11\0\1\12\71\0\53\11\24\12\1\11\12\12\6\0" + + "\6\11\4\12\4\11\3\12\1\11\3\12\2\11\7\12\3\11\4\12" + + "\15\11\14\12\1\11\17\12\2\0\46\11\12\0\53\11\1\0\1\11" + + "\3\0\u0149\11\1\0\4\11\2\0\7\11\1\0\1\11\1\0\4\11" + + "\2\0\51\11\1\0\4\11\2\0\41\11\1\0\4\11\2\0\7\11" + + "\1\0\1\11\1\0\4\11\2\0\17\11\1\0\71\11\1\0\4\11" + + "\2\0\103\11\2\0\3\12\40\0\20\11\20\0\125\11\14\0\u026c\11" + + "\2\0\21\11\1\0\32\11\5\0\113\11\3\0\3\11\17\0\15\11" + "\1\0\4\11\3\12\13\0\22\11\3\12\13\0\22\11\2\12\14\0" + "\15\11\1\0\3\11\1\0\2\12\14\0\64\11\40\12\3\0\1\11" + "\3\0\2\11\1\12\2\0\12\12\41\0\3\12\2\0\12\12\6\0" - + "\130\11\10\0\51\11\1\12\126\0\35\11\3\0\14\12\4\0\14\12" - + "\12\0\12\12\36\11\2\0\5\11\u038b\0\154\11\224\0\234\11\4\0" - + "\132\11\6\0\26\11\2\0\6\11\2\0\46\11\2\0\6\11\2\0" - + "\10\11\1\0\1\11\1\0\1\11\1\0\1\11\1\0\37\11\2\0" - + "\65\11\1\0\7\11\1\0\1\11\3\0\3\11\1\0\7\11\3\0" - + "\4\11\2\0\6\11\4\0\15\11\5\0\3\11\1\0\7\11\17\0" - + "\4\12\32\0\5\12\20\0\2\11\23\0\1\11\13\0\4\12\6\0" - + "\6\12\1\0\1\11\15\0\1\11\40\0\22\11\36\0\15\12\4\0" - + "\1\12\3\0\6\12\27\0\1\11\4\0\1\11\2\0\12\11\1\0" - + "\1\11\3\0\5\11\6\0\1\11\1\0\1\11\1\0\1\11\1\0" - + "\4\11\1\0\3\11\1\0\7\11\3\0\3\11\5\0\5\11\26\0" - + "\44\11\u0e81\0\3\11\31\0\11\11\6\12\1\0\5\11\2\0\5\11" - + "\4\0\126\11\2\0\2\12\2\0\3\11\1\0\137\11\5\0\50\11" - + "\4\0\136\11\21\0\30\11\70\0\20\11\u0200\0\u19b6\11\112\0\u51a6\11" - + "\132\0\u048d\11\u0773\0\u2ba4\11\u215c\0\u012e\11\2\0\73\11\225\0\7\11" - + "\14\0\5\11\5\0\1\11\1\12\12\11\1\0\15\11\1\0\5\11" - + "\1\0\1\11\1\0\2\11\1\0\2\11\1\0\154\11\41\0\u016b\11" - + "\22\0\100\11\2\0\66\11\50\0\15\11\3\0\20\12\20\0\4\12" - + "\17\0\2\11\30\0\3\11\31\0\1\11\6\0\5\11\1\0\207\11" - + "\2\0\1\12\4\0\1\11\13\0\12\12\7\0\32\11\4\0\1\11" - + "\1\0\32\11\12\0\132\11\3\0\6\11\2\0\6\11\2\0\6\11" - + "\2\0\3\11\3\0\2\11\3\0\2\11\22\0\3\12\4\0"; + + "\130\11\10\0\51\11\1\12\1\11\5\0\106\11\12\0\35\11\3\0" + + "\14\12\4\0\14\12\12\0\12\12\36\11\2\0\5\11\13\0\54\11" + + "\4\0\21\12\7\11\2\12\6\0\12\12\46\0\27\11\5\12\4\0" + + "\65\11\12\12\1\0\35\12\2\0\13\12\6\0\12\12\15\0\1\11" + + "\130\0\5\12\57\11\21\12\7\11\4\0\12\12\21\0\11\12\14\0" + + "\3\12\36\11\12\12\3\0\2\11\12\12\6\0\46\11\16\12\14\0" + + "\44\11\24\12\10\0\12\12\3\0\3\11\12\12\44\11\122\0\3\12" + + "\1\0\25\12\4\11\1\12\4\11\1\12\15\0\300\11\47\12\25\0" + + "\4\12\u0116\11\2\0\6\11\2\0\46\11\2\0\6\11\2\0\10\11" + + "\1\0\1\11\1\0\1\11\1\0\1\11\1\0\37\11\2\0\65\11" + + "\1\0\7\11\1\0\1\11\3\0\3\11\1\0\7\11\3\0\4\11" + + "\2\0\6\11\4\0\15\11\5\0\3\11\1\0\7\11\16\0\5\12" + + "\32\0\5\12\20\0\2\11\23\0\1\11\13\0\5\12\5\0\6\12" + + "\1\0\1\11\15\0\1\11\20\0\15\11\3\0\32\11\26\0\15\12" + + "\4\0\1\12\3\0\14\12\21\0\1\11\4\0\1\11\2\0\12\11" + + "\1\0\1\11\3\0\5\11\6\0\1\11\1\0\1\11\1\0\1\11" + + "\1\0\4\11\1\0\13\11\2\0\4\11\5\0\5\11\4\0\1\11" + + "\21\0\51\11\u0a77\0\57\11\1\0\57\11\1\0\205\11\6\0\4\11" + + "\3\12\16\0\46\11\12\0\66\11\11\0\1\11\17\0\1\12\27\11" + + "\11\0\7\11\1\0\7\11\1\0\7\11\1\0\7\11\1\0\7\11" + + "\1\0\7\11\1\0\7\11\1\0\7\11\1\0\40\12\57\0\1\11" + + "\u01d5\0\3\11\31\0\11\11\6\12\1\0\5\11\2\0\5\11\4\0" + + "\126\11\2\0\2\12\2\0\3\11\1\0\132\11\1\0\4\11\5\0" + + "\51\11\3\0\136\11\21\0\33\11\65\0\20\11\u0200\0\u19b6\11\112\0" + + "\u51cc\11\64\0\u048d\11\103\0\56\11\2\0\u010d\11\3\0\20\11\12\12" + + "\2\11\24\0\57\11\1\12\14\0\2\12\1\0\31\11\10\0\120\11" + + "\2\12\45\0\11\11\2\0\147\11\2\0\4\11\1\0\2\11\16\0" + + "\12\11\120\0\10\11\1\12\3\11\1\12\4\11\1\12\27\11\5\12" + + "\20\0\1\11\7\0\64\11\14\0\2\12\62\11\21\12\13\0\12\12" + + "\6\0\22\12\6\11\3\0\1\11\4\0\12\12\34\11\10\12\2\0" + + "\27\11\15\12\14\0\35\11\3\0\4\12\57\11\16\12\16\0\1\11" + + "\12\12\46\0\51\11\16\12\11\0\3\11\1\12\10\11\2\12\2\0" + + "\12\12\6\0\27\11\3\0\1\11\1\12\4\0\60\11\1\12\1\11" + + "\3\12\2\11\2\12\5\11\2\12\1\11\1\12\1\11\30\0\3\11" + + "\43\0\6\11\2\0\6\11\2\0\6\11\11\0\7\11\1\0\7\11" + + "\221\0\43\11\10\12\1\0\2\12\2\0\12\12\6\0\u2ba4\11\14\0" + + "\27\11\4\0\61\11\u2104\0\u012e\11\2\0\76\11\2\0\152\11\46\0" + + "\7\11\14\0\5\11\5\0\1\11\1\12\12\11\1\0\15\11\1\0" + + "\5\11\1\0\1\11\1\0\2\11\1\0\2\11\1\0\154\11\41\0" + + "\u016b\11\22\0\100\11\2\0\66\11\50\0\15\11\3\0\20\12\20\0" + + "\7\12\14\0\2\11\30\0\3\11\31\0\1\11\6\0\5\11\1\0" + + "\207\11\2\0\1\12\4\0\1\11\13\0\12\12\7\0\32\11\4\0" + + "\1\11\1\0\32\11\13\0\131\11\3\0\6\11\2\0\6\11\2\0" + + "\6\11\2\0\3\11\3\0\2\11\3\0\2\11\22\0\3\12\4\0"; /** * Translates characters to character classes */ @@ -145,16 +161,51 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\3\0\2\1\1\2\1\1\1\2\1\3\2\4\1\1" - + "\1\5\2\6\1\7\1\10\1\11\1\10\1\11\2\1" - + "\1\12\1\0\1\13\1\2\1\14\2\15\1\16\1\17" - + "\1\20\1\21\1\22\1\23\1\24\1\25\1\0\1\26" - + "\1\0\1\26\1\0\1\2\1\15\1\0\1\26\1\0" - + "\1\2\1\0\1\2\1\27\15\2\1\0\2\2\2\0" - + "\2\2\1\30\1\2\6\0\1\31\1\32"; + "\3\0\4\1\2\2\1\1\1\2\1\1\1\2\1\1" + + "\1\2\1\1\1\2\1\1\1\2\1\1\1\2\1\1" + + "\1\2\1\1\1\2\1\1\1\2\1\1\1\2\1\1" + + "\1\2\1\3\2\4\1\1\1\5\2\6\1\7\1\10" + + "\1\11\1\12\1\13\1\10\1\12\2\1\16\10\1\14" + + "\1\10\1\15\1\16\1\17\1\20\1\10\1\21\1\0" + + "\1\22\2\0\2\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\1\0\1\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\1\0\1\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\1\23\2\24\1\25\1\26\1\27\1\30\1\31" + + "\1\32\1\33\1\34\1\0\2\10\1\35\1\0\1\35" + + "\1\0\5\10\1\36\33\10\2\0\2\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\37\1\2\1\37" + + "\1\0\1\2\1\0\1\2\1\0\1\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\2\1\24\1\0" + + "\2\10\1\35\1\0\41\10\2\0\2\2\1\0\1\2" + + "\2\40\1\0\1\2\1\0\1\2\1\0\1\2\1\0" + + "\1\2\2\41\1\0\1\2\2\42\1\0\1\2\2\43" + + "\1\0\12\10\1\44\1\45\4\10\1\46\1\47\3\10" + + "\1\50\7\10\1\51\1\10\1\52\5\10\3\0\3\2" + + "\1\0\1\2\2\53\2\54\1\0\1\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\55\4\10\1\56\1\57" + + "\23\10\1\60\1\61\5\10\1\62\1\63\1\64\2\0" + + "\1\64\2\2\1\0\1\2\1\0\1\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\2\1\10\1\64" + + "\5\10\1\65\10\10\1\66\1\10\1\67\2\10\1\70" + + "\1\71\1\72\5\10\1\73\2\0\2\2\1\0\1\2" + + "\1\0\1\2\1\0\1\2\1\0\1\2\2\74\1\0" + + "\1\2\7\10\1\75\10\10\1\76\1\77\5\10\1\0" + + "\1\100\1\2\1\100\1\0\1\2\1\0\1\2\1\0" + + "\1\2\2\101\1\0\1\2\1\102\1\10\1\103\4\10" + + "\1\104\1\10\1\105\4\10\1\106\1\10\1\107\1\110" + + "\1\111\1\112\3\10\1\0\1\2\1\0\1\2\2\113" + + "\1\0\1\2\1\0\1\2\1\114\10\10\1\115\1\116" + + "\1\10\1\117\1\120\2\10\1\0\1\2\3\0\3\2" + + "\1\0\1\2\2\121\1\122\13\10\1\0\1\2\3\0" + + "\3\2\1\0\1\2\1\123\5\10\1\124\5\10\1\0" + + "\1\2\3\0\3\2\1\0\1\2\11\10\1\125\2\126" + + "\3\0\2\2\1\0\1\2\11\10\4\0\2\2\2\127" + + "\6\10\1\130\2\10\1\131\2\0\1\2\5\10\1\132" + + "\1\10\1\133\3\0\2\10\1\134\1\135\2\10\2\0" + + "\1\136\1\137\1\140\1\10\1\141\1\142\1\143"; private static int[] zzUnpackAction() { - int[] result = new int[81]; + int[] result = new int[615]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -178,20 +229,86 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = - "\0\0\0\50\0\120\0\170\0\240\0\310\0\360\0\u0118" - + "\0\u0140\0\u0168\0\170\0\u0190\0\170\0\u01b8\0\170\0\u01e0" - + "\0\u0208\0\u0230\0\u0258\0\u0280\0\u02a8\0\u02d0\0\170\0\360" - + "\0\170\0\u02f8\0\170\0\u0320\0\u0348\0\170\0\170\0\170" - + "\0\170\0\170\0\170\0\170\0\170\0\u0370\0\u0398\0\u03c0" - + "\0\u0280\0\u02d0\0\u03e8\0\170\0\u0410\0\u0438\0\u0438\0\u0460" - + "\0\u0488\0\u04b0\0\170\0\u04d8\0\u0500\0\u0528\0\u0550\0\u0578" - + "\0\u05a0\0\u05c8\0\u05f0\0\u0618\0\u0640\0\u0668\0\u0690\0\u06b8" - + "\0\u06e0\0\u0708\0\u0730\0\u0758\0\u0780\0\u07a8\0\u07d0\0\170" - + "\0\u07f8\0\u0820\0\u0848\0\u0870\0\u0898\0\u08c0\0\u08e8\0\170" - + "\0\170"; + "\0\0\0\113\0\226\0\341\0\u012c\0\u0177\0\u01c2\0\u020d" + + "\0\u0258\0\u02a3\0\u02ee\0\u0339\0\u0384\0\u03cf\0\u041a\0\u0465" + + "\0\u04b0\0\u04fb\0\u0546\0\u0591\0\u05dc\0\u0627\0\u0672\0\u06bd" + + "\0\u0708\0\u0753\0\u079e\0\u07e9\0\u0834\0\u087f\0\u08ca\0\u0915" + + "\0\u0960\0\341\0\u09ab\0\341\0\u09f6\0\341\0\u0a41\0\u0a8c" + + "\0\341\0\u0ad7\0\341\0\u0b22\0\u0b6d\0\u0bb8\0\u0c03\0\u0c4e" + + "\0\u0c99\0\u0ce4\0\u0d2f\0\u0d7a\0\u0dc5\0\u0e10\0\u0e5b\0\u0ea6" + + "\0\u0ef1\0\u0f3c\0\u0f87\0\u0fd2\0\u101d\0\341\0\u1068\0\341" + + "\0\341\0\341\0\341\0\u10b3\0\341\0\u01c2\0\341\0\u10fe" + + "\0\u1149\0\u1194\0\u11df\0\u122a\0\u1275\0\u12c0\0\u130b\0\u1356" + + "\0\u13a1\0\u13ec\0\u1437\0\u1482\0\u14cd\0\u1518\0\u1563\0\u15ae" + + "\0\u15f9\0\u1644\0\u168f\0\u16da\0\u1725\0\u1770\0\u17bb\0\u1806" + + "\0\u1851\0\341\0\u189c\0\u18e7\0\341\0\341\0\341\0\341" + + "\0\341\0\341\0\341\0\341\0\u1932\0\u197d\0\u19c8\0\u1a13" + + "\0\u1a5e\0\u0b6d\0\u0c03\0\u1aa9\0\u1af4\0\u1b3f\0\u1b8a\0\u1bd5" + + "\0\u0b22\0\u1c20\0\u1c6b\0\u1cb6\0\u1d01\0\u1d4c\0\u1d97\0\u1de2" + + "\0\u1e2d\0\u1e78\0\u1ec3\0\u1f0e\0\u1f59\0\u1fa4\0\u1fef\0\u203a" + + "\0\u2085\0\u20d0\0\u211b\0\u2166\0\u21b1\0\u21fc\0\u2247\0\u2292" + + "\0\u22dd\0\u2328\0\u2373\0\u23be\0\u2409\0\u2454\0\u249f\0\u24ea" + + "\0\u2535\0\u2580\0\u25cb\0\u2616\0\u2661\0\u26ac\0\u26f7\0\u01c2" + + "\0\u2742\0\u0258\0\u278d\0\u27d8\0\u2823\0\u286e\0\u28b9\0\u2904" + + "\0\u294f\0\u299a\0\u29e5\0\u2a30\0\u2a7b\0\u2ac6\0\u2b11\0\u2b5c" + + "\0\341\0\u2ba7\0\u2bf2\0\u2c3d\0\u2c88\0\u2c88\0\u2cd3\0\u2d1e" + + "\0\u2d69\0\u2db4\0\u2dff\0\u2e4a\0\u2e95\0\u2ee0\0\u2f2b\0\u2f76" + + "\0\u2fc1\0\u300c\0\u3057\0\u30a2\0\u30ed\0\u3138\0\u3183\0\u31ce" + + "\0\u3219\0\u3264\0\u32af\0\u32fa\0\u3345\0\u3390\0\u33db\0\u3426" + + "\0\u3471\0\u34bc\0\u3507\0\u3552\0\u359d\0\u35e8\0\u3633\0\u367e" + + "\0\u36c9\0\u3714\0\u375f\0\u37aa\0\u37f5\0\u01c2\0\u0258\0\u3840" + + "\0\u388b\0\u38d6\0\u3921\0\u396c\0\u39b7\0\u3a02\0\u3a4d\0\u01c2" + + "\0\u0258\0\u3a98\0\u3ae3\0\u01c2\0\u0258\0\u3b2e\0\u3b79\0\u01c2" + + "\0\u0258\0\u3bc4\0\u3c0f\0\u3c5a\0\u3ca5\0\u3cf0\0\u3d3b\0\u3d86" + + "\0\u3dd1\0\u3e1c\0\u3e67\0\u3eb2\0\u0b22\0\u3efd\0\u3f48\0\u3f93" + + "\0\u3fde\0\u4029\0\u4074\0\u0b22\0\u40bf\0\u410a\0\u4155\0\u41a0" + + "\0\u41eb\0\u4236\0\u4281\0\u42cc\0\u4317\0\u4362\0\u43ad\0\u0b22" + + "\0\u43f8\0\u0b22\0\u4443\0\u448e\0\u44d9\0\u4524\0\u456f\0\u45ba" + + "\0\u4605\0\u4650\0\u469b\0\u46e6\0\u4731\0\u477c\0\u47c7\0\u4812" + + "\0\u485d\0\u01c2\0\u0258\0\u48a8\0\u48f3\0\u493e\0\u4989\0\u49d4" + + "\0\u4a1f\0\u4a6a\0\u4ab5\0\341\0\u4b00\0\u4b4b\0\u4b96\0\u4be1" + + "\0\u0b22\0\u0b22\0\u4c2c\0\u4c77\0\u4cc2\0\u4d0d\0\u4d58\0\u4da3" + + "\0\u4dee\0\u4e39\0\u4e84\0\u4ecf\0\u4f1a\0\u4f65\0\u4fb0\0\u4ffb" + + "\0\u5046\0\u5091\0\u50dc\0\u5127\0\u5172\0\u0b22\0\u0b22\0\u51bd" + + "\0\u5208\0\u5253\0\u529e\0\u52e9\0\u5334\0\u0b22\0\u01c2\0\u537f" + + "\0\u53ca\0\u0258\0\u5415\0\u5460\0\u54ab\0\u54f6\0\u5541\0\u558c" + + "\0\u55d7\0\u5622\0\u566d\0\u56b8\0\u5703\0\u574e\0\u5799\0\u57e4" + + "\0\u582f\0\u0b22\0\u587a\0\u58c5\0\u5910\0\u595b\0\u59a6\0\u0b22" + + "\0\u59f1\0\u5a3c\0\u5a87\0\u5ad2\0\u5b1d\0\u5b68\0\u5bb3\0\u5bfe" + + "\0\u0b22\0\u5c49\0\u0b22\0\u5c94\0\u5cdf\0\u0b22\0\u0b22\0\u0b22" + + "\0\u5d2a\0\u5d75\0\u5dc0\0\u5e0b\0\u5e56\0\u0b22\0\u5ea1\0\u5eec" + + "\0\u5f37\0\u5f82\0\u5fcd\0\u6018\0\u6063\0\u60ae\0\u60f9\0\u6144" + + "\0\u618f\0\u61da\0\u01c2\0\u0258\0\u6225\0\u6270\0\u62bb\0\u6306" + + "\0\u6351\0\u639c\0\u63e7\0\u6432\0\u647d\0\u0b22\0\u64c8\0\u6513" + + "\0\u655e\0\u65a9\0\u65f4\0\u663f\0\u668a\0\u66d5\0\u6720\0\u0b22" + + "\0\u676b\0\u67b6\0\u6801\0\u684c\0\u6897\0\u68e2\0\u01c2\0\u692d" + + "\0\u0258\0\u6978\0\u69c3\0\u6a0e\0\u6a59\0\u6aa4\0\u6aef\0\u01c2" + + "\0\u0258\0\u6b3a\0\u6b85\0\u0b22\0\u6bd0\0\u6c1b\0\u6c66\0\u6cb1" + + "\0\u6cfc\0\u6d47\0\u0b22\0\u6d92\0\u0b22\0\u6ddd\0\u6e28\0\u6e73" + + "\0\u6ebe\0\u0b22\0\u6f09\0\u0b22\0\u6f54\0\u0b22\0\u0b22\0\u6f9f" + + "\0\u6fea\0\u7035\0\u7080\0\u70cb\0\u7116\0\u7161\0\u01c2\0\u0258" + + "\0\u71ac\0\u71f7\0\u7242\0\u728d\0\u72d8\0\u7323\0\u736e\0\u73b9" + + "\0\u7404\0\u744f\0\u749a\0\u74e5\0\u7530\0\u0b22\0\u0b22\0\u757b" + + "\0\u0b22\0\u0b22\0\u75c6\0\u7611\0\u765c\0\u76a7\0\u76f2\0\u773d" + + "\0\u7788\0\u77d3\0\u781e\0\u7869\0\u78b4\0\u78ff\0\u01c2\0\u0258" + + "\0\u794a\0\u7995\0\u79e0\0\u7a2b\0\u7a76\0\u7ac1\0\u7b0c\0\u7b57" + + "\0\u7ba2\0\u7bed\0\u7c38\0\u7c83\0\u7cce\0\u7d19\0\u7d64\0\u7daf" + + "\0\u7dfa\0\u7e45\0\u7e90\0\u7edb\0\u7f26\0\u7f71\0\u0b22\0\u7fbc" + + "\0\u8007\0\u8052\0\u809d\0\u80e8\0\u0b22\0\u8133\0\u817e\0\u81c9" + + "\0\u8214\0\u825f\0\u82aa\0\u82f5\0\u8340\0\u838b\0\u83d6\0\u8421" + + "\0\u846c\0\u84b7\0\u8502\0\u854d\0\u8598\0\u85e3\0\u862e\0\u8679" + + "\0\u86c4\0\u870f\0\u875a\0\u87a5\0\u87f0\0\u0b22\0\u01c2\0\u0258" + + "\0\u883b\0\u8886\0\u88d1\0\u891c\0\u8967\0\u89b2\0\u89fd\0\u8a48" + + "\0\u8a93\0\u8ade\0\u8b29\0\u8b74\0\u8bbf\0\u8c0a\0\u8c55\0\u8ca0" + + "\0\u8ceb\0\u8d36\0\u8d81\0\u8dcc\0\u8e17\0\u8e62\0\u01c2\0\u0258" + + "\0\u8ead\0\u8ef8\0\u8f43\0\u8f8e\0\u8fd9\0\u9024\0\u0b22\0\u906f" + + "\0\u90ba\0\341\0\u9105\0\u9150\0\u919b\0\u91e6\0\u9231\0\u927c" + + "\0\u92c7\0\u9312\0\u0b22\0\u935d\0\u0b22\0\u93a8\0\u93f3\0\u943e" + + "\0\u9489\0\u94d4\0\u0b22\0\u0b22\0\u951f\0\u956a\0\u95b5\0\u9600" + + "\0\341\0\u0b22\0\u0b22\0\u964b\0\u0b22\0\341\0\u0b22"; private static int[] zzUnpackRowMap() { - int[] result = new int[81]; + int[] result = new int[615]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -212,118 +329,2090 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = - "\4\4\1\5\1\6\3\4\1\7\1\4\1\6\1\7" - + "\4\4\1\7\1\10\3\4\12\6\1\5\2\6\1\4" - + "\2\6\2\4\1\11\1\12\1\13\22\11\1\14\15\11" - + "\1\15\4\11\1\4\1\16\1\17\1\20\1\4\1\21" - + "\1\4\1\22\1\4\1\23\1\4\2\23\1\4\1\24" - + "\1\25\1\26\2\23\1\4\1\22\1\4\12\23\1\4" - + "\2\23\1\27\2\23\1\4\1\22\54\0\1\5\33\0" - + "\1\5\14\0\1\6\1\0\1\6\1\0\2\30\2\6" - + "\1\31\1\6\2\0\1\30\1\6\1\0\1\6\1\0" - + "\12\6\1\0\2\6\1\0\2\6\1\0\1\6\5\0" - + "\1\30\1\0\1\30\1\0\4\30\1\31\1\30\2\0" - + "\2\30\1\0\1\30\1\0\12\30\1\0\2\30\1\0" - + "\2\30\1\0\1\30\5\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\1\32\11\6\1\0\2\6\1\0\2\6" - + "\1\0\1\6\1\11\2\0\22\11\1\0\15\11\1\0" - + "\4\11\2\0\1\13\45\0\2\33\1\0\13\33\1\34" - + "\5\33\1\35\1\36\3\33\1\37\2\33\1\40\2\33" - + "\1\41\3\33\1\42\1\43\1\44\1\45\1\34\2\0" - + "\1\17\45\0\1\20\2\0\45\20\5\0\1\23\1\46" - + "\1\23\1\0\4\23\1\0\1\23\2\0\2\23\1\0" - + "\1\23\1\0\12\23\1\0\2\23\1\0\2\23\1\0" - + "\1\23\7\0\1\22\6\0\1\22\1\0\1\47\2\50" - + "\1\0\1\22\22\0\1\22\5\0\1\23\1\0\1\23" - + "\1\0\4\23\1\0\1\23\2\0\2\23\1\0\1\23" - + "\1\0\12\23\1\0\2\23\1\0\2\23\1\0\1\23" - + "\7\0\1\51\6\0\1\51\1\0\1\47\2\50\1\0" - + "\1\51\22\0\1\51\7\0\1\22\6\0\1\51\1\0" - + "\1\52\3\0\1\22\22\0\1\22\7\0\1\47\6\0" - + "\1\47\5\0\1\47\22\0\1\47\5\0\1\6\1\0" - + "\1\6\1\0\2\30\2\6\1\31\1\6\2\0\1\30" - + "\1\6\1\0\1\6\1\0\1\6\1\53\10\6\1\0" - + "\2\6\1\0\2\6\1\0\1\6\16\0\1\35\5\0" - + "\1\35\22\0\1\35\16\0\1\54\5\0\1\54\22\0" - + "\1\54\7\0\1\55\6\0\1\55\5\0\1\55\22\0" - + "\1\55\7\0\1\47\6\0\1\47\2\0\2\50\1\0" - + "\1\47\22\0\1\47\7\0\1\56\6\0\1\56\1\57" - + "\3\0\1\57\1\56\22\0\1\56\5\0\1\6\1\0" - + "\1\6\1\0\2\30\2\6\1\31\1\6\2\0\1\30" - + "\1\60\1\0\1\6\1\0\12\6\1\0\2\6\1\0" - + "\2\6\1\0\1\6\7\0\1\55\1\61\5\0\1\55" - + "\5\0\1\55\22\0\1\55\7\0\1\56\6\0\1\56" - + "\5\0\1\56\22\0\1\56\5\0\1\6\1\0\1\6" - + "\1\0\2\30\2\6\1\31\1\6\2\0\1\30\1\6" - + "\1\0\1\6\1\0\2\6\1\62\7\6\1\0\2\6" - + "\1\0\2\6\1\0\1\6\43\0\1\63\11\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\3\6\1\64\6\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\4\6\1\65\5\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\5\6\1\66\4\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\6\6\1\67\3\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\70\1\0\1\6\1\0\3\6\1\71\3\6" - + "\1\72\2\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\6\6" - + "\1\73\3\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\10\6" - + "\1\74\1\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\3\6" - + "\1\75\6\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\12\6" - + "\1\0\1\76\1\6\1\0\2\6\1\0\1\6\5\0" - + "\1\6\1\0\1\6\1\0\2\30\2\6\1\31\1\6" - + "\2\0\1\30\1\6\1\0\1\6\1\0\11\6\1\77" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\10\6\1\100\1\6" - + "\1\0\2\6\1\0\2\6\1\0\1\6\5\0\1\6" - + "\1\0\1\6\1\0\2\30\2\6\1\31\1\6\2\0" - + "\1\30\1\6\1\0\1\6\1\0\12\6\1\101\2\6" - + "\1\0\2\6\1\0\1\6\5\0\1\6\1\0\1\6" - + "\1\0\2\30\2\6\1\31\1\6\2\0\1\30\1\6" - + "\1\0\1\6\1\0\12\6\1\0\1\6\1\102\1\0" - + "\2\6\1\0\1\6\5\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\11\6\1\103\1\0\2\6\1\0\2\6" - + "\1\0\1\6\7\0\1\104\6\0\1\105\5\0\1\104" - + "\22\0\1\104\5\0\1\6\1\0\1\6\1\0\2\30" - + "\2\6\1\31\1\6\2\0\1\30\1\106\1\0\1\6" - + "\1\0\12\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\5\0\1\6\1\0\1\6\1\0\2\30\2\6\1\31" - + "\1\6\2\0\1\30\1\6\1\0\1\6\1\0\3\6" - + "\1\107\6\6\1\0\2\6\1\0\2\6\1\0\1\6" - + "\7\0\1\104\5\0\1\110\1\104\5\0\1\104\22\0" - + "\1\104\15\0\1\110\37\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\3\6\1\111\6\6\1\0\2\6\1\0" - + "\2\6\1\0\1\6\5\0\1\6\1\0\1\6\1\0" - + "\2\30\2\6\1\31\1\6\2\0\1\30\1\6\1\0" - + "\1\6\1\0\12\6\1\112\2\6\1\0\2\6\1\0" - + "\1\6\5\0\1\6\1\0\1\6\1\0\2\30\2\6" - + "\1\31\1\6\2\0\1\30\1\6\1\0\1\6\1\0" - + "\12\6\1\113\2\6\1\0\2\6\1\0\1\6\7\0" - + "\1\114\6\0\1\115\5\0\1\114\22\0\1\114\7\0" - + "\1\116\6\0\1\117\5\0\1\116\22\0\1\116\7\0" - + "\1\114\5\0\1\120\1\114\5\0\1\114\22\0\1\114" - + "\15\0\1\120\41\0\1\116\5\0\1\121\1\116\5\0" - + "\1\116\22\0\1\116\15\0\1\121\32\0"; + "\4\4\1\5\1\6\3\4\1\7\1\4\1\10\1\11" + + "\1\7\4\4\1\12\1\13\3\4\1\7\1\11\1\14" + + "\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24" + + "\1\25\1\26\1\27\1\7\1\11\1\7\1\11\1\30" + + "\1\31\1\5\1\7\1\11\1\7\1\11\1\7\1\11" + + "\1\32\1\33\1\34\1\35\1\7\1\11\1\36\1\37" + + "\1\7\1\11\1\7\1\11\1\4\1\7\1\11\4\4" + + "\1\7\1\11\4\4\1\40\1\41\1\42\23\40\1\43" + + "\47\40\1\44\14\40\1\4\1\45\1\46\1\47\1\4" + + "\1\50\1\51\1\52\1\53\1\54\1\4\1\50\2\54" + + "\1\4\1\55\1\56\1\57\2\60\1\4\1\52\1\4" + + "\2\54\2\61\2\62\2\63\2\64\2\65\2\66\2\67" + + "\2\54\2\70\1\4\2\71\2\72\2\54\2\73\2\54" + + "\2\74\4\54\2\75\1\76\2\77\1\100\1\101\1\102" + + "\1\103\2\104\1\105\1\52\1\4\1\52\117\0\1\5" + + "\46\0\1\5\44\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\110\1\0\1\106\1\0\20\106" + + "\2\111\2\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\110\1\112" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\111\1\113\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\2\114\22\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\114\1\115\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\12\106\2\116\10\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\116\1\117\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\20\106\2\120\2\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\120\1\121\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\22\106\2\122" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\122\1\123\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\14\106" + + "\2\124\6\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\124" + + "\1\125\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\4\106\2\126\16\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\126\1\127\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\20\106\2\130\2\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\130" + + "\1\131\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\132\1\0\1\106\1\0\24\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\132\1\133\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\24\106\1\0\10\106" + + "\2\134\10\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\134\1\135" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\12\106" + + "\2\136\10\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\136\1\137\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\12\106\2\140\10\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\140" + + "\1\141\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\1\40\2\0" + + "\23\40\1\0\47\40\1\0\14\40\2\0\1\42\110\0" + + "\2\142\1\0\14\142\1\143\5\142\1\144\1\145\6\142" + + "\2\146\4\142\2\147\4\142\2\150\7\142\2\151\4\142" + + "\2\152\4\142\1\153\12\142\1\154\1\143\2\0\1\46" + + "\110\0\1\47\2\0\110\47\5\0\1\54\1\155\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\156\1\0\1\54" + + "\1\0\24\54\1\0\12\54\2\157\6\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\7\0\1\52" + + "\7\0\1\52\1\0\1\160\2\161\1\0\1\52\62\0" + + "\1\52\1\0\1\52\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\7\0\1\162\7\0\1\162\1\0" + + "\1\160\2\161\1\0\1\162\62\0\1\162\1\0\1\162" + + "\7\0\1\52\7\0\1\162\1\0\1\163\3\0\1\52" + + "\62\0\1\52\1\0\1\52\7\0\1\160\7\0\1\160" + + "\5\0\1\160\62\0\1\160\1\0\1\160\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\2\164\22\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\12\54\2\165\10\54\1\0" + + "\10\54\2\166\10\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\167\2\170\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\12\54\2\171\4\54\2\172\2\173\1\0" + + "\4\54\2\174\14\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\14\54\2\175\6\54\1\0\2\54\2\176\16\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\177\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\200\1\0\1\54\1\0\20\54\2\201\2\54\1\0" + + "\12\54\2\202\6\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\203\1\0\1\54\1\0" + + "\6\54\2\204\14\54\1\0\10\54\2\205\10\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\206\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\207\1\0\1\54\1\0\10\54\2\210" + + "\2\211\10\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\212\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\10\54\2\213\6\54\2\214\2\215\1\0\12\54" + + "\2\216\6\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\217\2\220\2\54\2\221\6\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\222\2\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\14\54\2\223" + + "\6\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\224\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\6\106\2\225\14\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\2\226\22\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\225\1\227\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\226" + + "\1\230\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\2\106\2\231\20\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\231\1\232\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\2\233\20\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\233" + + "\1\234\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\22\106\2\235\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\235\1\236\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\20\106\2\237\2\106\1\0\4\106\2\240\14\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\237" + + "\1\241\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\240\1\242\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\10\106\2\243\12\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\243\1\244\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\245\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\245\1\246\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\247\1\0\1\106" + + "\1\0\2\106\1\247\2\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\24\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\247" + + "\1\0\1\11\1\0\2\106\1\250\2\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\6\106\2\251\14\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\251\1\252" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\20\106\2\253" + + "\2\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\253\1\254\1\106\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\2\106\2\255\20\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\255\1\256" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\24\106\1\0\2\257\20\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\257\1\260\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\17\0\1\144" + + "\5\0\1\144\64\0\1\144\17\0\1\261\5\0\1\261" + + "\64\0\1\261\7\0\1\262\7\0\1\262\5\0\1\262" + + "\62\0\1\262\1\0\1\262\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\263\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\264\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\7\0\1\160\7\0\1\160\2\0\2\161\1\0\1\160" + + "\62\0\1\160\1\0\1\160\7\0\1\265\7\0\1\265" + + "\1\266\3\0\1\266\1\265\62\0\1\265\1\0\1\265" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\4\54\2\267\16\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\270\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\271\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\2\54\2\272\20\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\10\54\2\273\2\274" + + "\10\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\22\54\2\275\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\12\54\2\276\6\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\4\54\2\277\16\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\6\54\2\300\14\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\301\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\302\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\303\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\304\1\0\1\54" + + "\1\0\2\54\1\304\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\305\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\6\54\2\306\14\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\20\54" + + "\2\307\2\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\12\54\2\310\10\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\311" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\2\54\2\312\20\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\16\54\2\313\4\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\12\54\2\314\6\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\315\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\316\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\10\54" + + "\2\317\10\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\12\54" + + "\2\320\10\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\14\54\2\321\6\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\6\54\2\322\12\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\14\54\2\323\6\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\2\324\20\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\325\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\20\54\2\326\2\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\10\54\2\327" + + "\10\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\24\106\1\0" + + "\20\106\2\330\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\16\106" + + "\2\331\4\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\330\1\332\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\331\1\333\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\334\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\334\1\335" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\336\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\336\1\337" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\20\106\2\340\2\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\340\1\341\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\10\106\2\342\12\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\342" + + "\1\343\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\6\106\2\344\14\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\344" + + "\1\345\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\10\106" + + "\2\346\12\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\346\1\347\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\350\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\350\1\351" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\12\106\2\352\6\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\352\1\353\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\24\106\1\0\2\106\2\354\16\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\354\1\355" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\20\106\2\356\2\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\356\1\357\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\4\106\2\360\14\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\360\1\361\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\7\0\1\262\1\362\6\0" + + "\1\262\5\0\1\262\62\0\1\262\1\0\1\262\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\363\2\54\1\0" + + "\20\54\2\364\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\365\14\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\7\0\1\265\7\0\1\265" + + "\5\0\1\265\62\0\1\265\1\0\1\265\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\366\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\16\54\2\367\4\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\16\54" + + "\2\370\4\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\16\54\2\371\2\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\372\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\6\54\2\373\14\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\54" + + "\2\374\16\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\375\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\376\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\377\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\12\54" + + "\2\u0100\10\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\22\54\2\u0101\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\2\u0102\20\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u0103" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\10\54\2\u0104\10\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\4\54\1\u0105\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u0106" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u0107\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0108\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\14\54\2\u0109\6\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u010a" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\4\54\2\u010b\16\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\14\54\2\u010c\4\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\u010d\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u010e" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u010f\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\u0110\1\0" + + "\1\54\1\0\2\54\1\u0110\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\2\54\2\u0111\20\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\u0112\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u0113" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\u0114\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\4\54\1\u0115\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\u0116\1\0\1\54" + + "\1\0\2\54\1\u0116\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\12\54\2\u0117\6\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\12\106\2\u0118\10\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\2\106" + + "\2\u0119\2\106\2\u011a\14\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0118" + + "\1\u011b\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\u0119" + + "\1\u011c\1\106\1\11\1\u011a\1\u011d\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\4\106\2\u011e\16\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\u011e\1\u011f\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\u0120\1\0\1\106\1\0\2\106\1\u0120\2\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\u0120\1\0\1\11\1\0\2\106" + + "\1\u0121\2\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\6\106\2\u0122\14\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u0122\1\u0123\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\16\106\2\u0124\4\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\u0124\1\u0125\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\12\106\2\u0126\10\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u0126\1\u0127\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\22\106\2\u0128" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0128\1\u0129\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\0\10\106\2\u012a\10\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u012a\1\u012b\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\76\0\1\u012c\21\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\2\u012d\20\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\12\54\2\u012e\10\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u012f" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\10\54\2\u0130\12\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0131\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\16\54\2\u0132\4\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u0133" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\u0134\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u0135\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u0136\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\14\54\2\u0137\6\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\2\54\2\u0138" + + "\16\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\22\54\2\u0139" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\22\54" + + "\2\u013a\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\4\54\1\u013b\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\16\54\2\u013c\4\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\2\u013d\20\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u013e\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\10\54\2\u013f\12\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u0140" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\u0141\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\u0142\1\0" + + "\1\54\1\0\2\54\1\u0142\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\10\54\2\u0143\12\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\10\54\2\u0144\10\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\u0145\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\10\54\2\u0146\10\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u0147\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0148\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u0149\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\6\54\2\u014a" + + "\12\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\4\54\2\u014b" + + "\4\54\2\u014c\10\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u014d\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u014e\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\24\106\1\0\2\u014f\20\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\12\106\2\u0150\10\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\20\106\2\u0151\2\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\u014f\1\u0152" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0150\1\u0153\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0151\1\u0154\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\u0155\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0155\1\u0156\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\14\106\2\u0157\6\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0157\1\u0158\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\2\106\2\u0159\20\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\u0159\1\u015a\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\14\106\2\u015b\6\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\u015b\1\u015c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\14\106" + + "\2\u015d\6\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u015d" + + "\1\u015e\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\2\106\2\u015f\20\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\u015f" + + "\1\u0160\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u0161\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\u0162" + + "\20\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\14\54\2\u0163" + + "\6\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\2\54\2\u0164\20\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\2\54\2\u0165\16\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\u0166\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\2\54\2\u0167" + + "\20\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u0168\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\20\54\2\u0169\2\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u016a\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u016b\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\10\54\2\u016c\12\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u016d" + + "\2\u016e\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\4\54\2\u016f\16\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\2\u0170\22\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\22\54\2\u0171\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\2\54\2\u0172\20\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\2\u0173\20\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\u0174\1\0\1\54\1\0\2\54" + + "\1\u0174\2\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u0175\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\2\u0176\20\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u0177\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\22\54\2\u0178\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\10\54\2\u0179\12\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\2\54\2\u017a\16\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\10\54\2\u017b\12\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u017c\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\4\54\2\u017d\16\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\20\54" + + "\2\u017e\2\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\4\106\2\u017f\16\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\2\106\2\u0180\20\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\u017f\1\u0181\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\u0180\1\u0182\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\10\106\2\u0183\12\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0183\1\u0184\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\20\106" + + "\2\u0185\2\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0185\1\u0186\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\12\106\2\u0187\10\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0187" + + "\1\u0188\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\20\106\2\u0189\2\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0189" + + "\1\u018a\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\16\106\2\u018b\4\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u018b" + + "\1\u018c\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\12\106" + + "\2\u018d\10\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\u018d\1\u018e\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\u018f\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u0190\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\10\54\2\u0191\12\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u0192\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u0193\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\u0194\14\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\u0195\1\0\1\54" + + "\1\0\2\54\1\u0195\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\22\54\2\u0196\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\4\54\1\u0197\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\u0198" + + "\20\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\2\54\2\u0199" + + "\16\54\2\u019a\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u019b\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u019c\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u019d\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\4\54\2\u019e\16\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u019f\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\10\54\2\u01a0\10\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\12\54\2\u01a1\10\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u01a2" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u01a3\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\22\54\2\u01a4\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u01a5" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\u01a6\1\0\1\106\1\0" + + "\24\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\0\16\106\2\u01a7\2\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\u01a6" + + "\1\u01a8\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u01a7" + + "\1\u01a9\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\12\106\2\u01aa\10\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u01aa\1\u01ab\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\u01ac\1\0\1\106\1\0\2\106\1\u01ac\2\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\24\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\u01ac\1\0\1\11\1\0\2\106\1\u01ad" + + "\2\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\4\106" + + "\2\u01ae\16\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\u01ae" + + "\1\u01af\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\10\106\2\u01b0\10\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u01b0\1\u01b1\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\24\106\1\0\12\106\2\u01b2\6\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\u01b2\1\u01b3" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u01b4\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\u01b5\1\0\1\54\1\0\2\54" + + "\1\u01b5\2\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\6\54\2\u01b6\14\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\10\54\2\u01b7\2\54\2\u01b8\6\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u01b9\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u01ba\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u01bb\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\22\54\2\u01bc\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\u01bd\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u01be\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\2\54\2\u01bf" + + "\16\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\16\54\2\u01c0" + + "\4\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\2\54\2\u01c1\20\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\16\54\2\u01c2\4\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\22\54\2\u01c3\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u01c4\2\54" + + "\1\0\10\54\2\u01c5\10\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\14\54\2\u01c6\6\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\22\54\2\u01c7\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u01c8\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\u01c9\2\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u01ca" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\0\2\u01cb\20\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\u01cb\1\u01cc\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\14\106\2\u01cd\6\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u01cd\1\u01ce\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\u01cf" + + "\1\0\1\106\1\0\24\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\u01cf\1\u01d0\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\u01d1" + + "\1\0\1\106\1\0\24\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\u01d1\1\u01d2\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\14\106\2\u01d3\6\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u01d3\1\u01d4\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u01d5\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\14\54\2\u01d6\6\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u01d7\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u01d8\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\20\54\2\u01d9\2\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\2\u01da" + + "\20\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\u01db\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u01dc" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\12\54\2\u01dd\6\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u01de\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\u01df\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\12\54\2\u01e0\10\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u01e1" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\24\54\1\0\2\u01e2\20\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\u01e3\1\0\1\54" + + "\1\0\2\54\1\u01e3\2\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\12\54\2\u01e4\10\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\u01e5\1\0\1\106\1\0\24\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\u01e5\1\u01e6\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\u01e7\1\0\1\106\1\0\6\106\2\u01e8\6\106" + + "\2\u01e9\4\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\u01e7\1\u01ea" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u01e8\1\u01eb\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u01e9\1\u01ec\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\2\u01ed\20\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\u01ed\1\u01ee\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\6\106\2\u01ef\14\106\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\u01ef\1\u01f0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\10\54\2\u01f1" + + "\10\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\20\54\2\u01f2" + + "\2\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u01f3\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\u01f4\1\0" + + "\1\54\1\0\2\54\1\u01f4\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\u01f5\1\0\1\54\1\0\2\54\1\u01f5\2\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\14\54\2\u01f6" + + "\6\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u01f7\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\22\54\1\0\2\54\4\0" + + "\2\u01f8\1\0\1\54\1\0\1\54\5\0\1\u01f9\1\0" + + "\1\54\1\0\2\54\1\u01f9\2\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\6\54\2\u01fa\14\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\4\54\1\u01fb" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u01fc\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\4\106\2\u01fd\16\106\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\u01fd\1\u01fe\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\14\106\2\u01ff\6\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\20\106\2\u0200\2\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\u0201\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u01ff" + + "\1\u0202\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\u0200\1\u0203\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0201\1\u0204\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\u0205\1\0\1\106" + + "\1\0\24\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\u0205\1\u0206" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u0207\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\u0208" + + "\1\0\1\54\1\0\2\54\1\u0208\2\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u0209\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u020a\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u020b\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u020c\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\6\54" + + "\2\u020d\14\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u020e\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u020f" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u0210" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u0211\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u0212\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\6\106" + + "\2\u0213\14\106\1\0\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0213\1\u0214\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\2\u0215\20\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\22\106\2\u0216\1\0\22\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\20\106\2\u0217\2\106\1\0\22\106" + + "\1\0\2\106\4\0\2\106\1\0\1\106\1\0\1\106" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\u0215\1\u0218\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\u0216\1\u0219\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\11\1\0\2\106\3\11\1\107" + + "\1\11\2\0\1\106\1\11\1\0\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0217" + + "\1\u021a\1\106\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\4\0\1\106\1\11\1\0\1\11\1\0\1\11" + + "\5\0\1\106\1\0\1\106\1\0\5\106\1\107\1\106" + + "\2\0\2\106\1\0\1\106\1\0\4\106\2\u021b\16\106" + + "\1\0\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\5\0\1\106\1\0\1\11\1\0\2\106" + + "\3\11\1\107\1\11\2\0\1\106\1\11\1\0\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\u021b\1\u021c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\4\0\1\106\1\11\1\0\1\11" + + "\1\0\1\11\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\u021d\1\0\1\54\1\0\24\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\22\54" + + "\2\u021e\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u021f\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\16\54\2\u0220\4\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\u0221\1\0\1\54\1\0\2\54\1\u0221\2\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\6\54\2\u0222" + + "\14\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\14\54\2\u0223\6\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\2\54\2\u0224\20\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\20\54\2\u0225\2\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\10\54\2\u0226\10\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\0\20\106\2\u0227\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u0227\1\u0228\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\u0229\22\106\1\0\2\106\4\0\2\106" + + "\1\0\1\106\1\0\1\106\5\0\1\106\1\0\1\106" + + "\1\0\5\106\1\107\1\106\2\0\2\106\1\0\1\106" + + "\1\0\24\106\1\0\2\106\2\u022a\16\106\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\106\1\0\5\106\1\107\1\106\2\0\2\106" + + "\1\0\1\106\1\0\22\106\2\u022b\1\0\22\106\1\0" + + "\2\106\4\0\2\106\1\0\1\106\1\0\1\106\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u0229\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\1\u022a\1\u022c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\11\1\0\2\106\3\11\1\107\1\11" + + "\2\0\1\106\1\11\1\0\1\11\1\0\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u022b\1\u022d\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\0\1\106\1\11" + + "\4\0\1\106\1\11\1\0\1\11\1\0\1\11\5\0" + + "\1\106\1\0\1\106\1\0\5\106\1\107\1\106\2\0" + + "\2\106\1\0\1\106\1\0\6\106\2\u022e\14\106\1\0" + + "\22\106\1\0\2\106\4\0\2\106\1\0\1\106\1\0" + + "\1\106\5\0\1\106\1\0\1\11\1\0\2\106\3\11" + + "\1\107\1\11\2\0\1\106\1\11\1\0\1\11\1\0" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\u022e\1\u022f" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\0" + + "\1\106\1\11\4\0\1\106\1\11\1\0\1\11\1\0" + + "\1\11\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\16\54\2\u0230" + + "\4\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\14\54\2\u0231\6\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\4\54\2\u0232\16\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\4\54\2\u0233\16\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\u0234\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\10\54\2\u0235" + + "\12\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\6\54\2\u0236\14\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\6\54\2\u0237\14\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\u0238\1\0\1\54\1\0\2\54\1\u0238\2\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\24\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\7\0\1\u0239\7\0\1\u023a\5\0\1\u0239\62\0" + + "\1\u0239\1\0\1\u0239\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\u023b\1\0\1\106\1\0" + + "\24\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\6\106\2\u023c\14\106\1\0\22\106\1\0\2\106\4\0" + + "\2\106\1\0\1\106\1\0\1\106\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\u023b" + + "\1\u023d\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\11\1\0\2\106\3\11\1\107\1\11\2\0\1\106" + + "\1\11\1\0\1\11\1\0\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u023c\1\u023e\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\0\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\0\1\106\1\11\4\0\1\106" + + "\1\11\1\0\1\11\1\0\1\11\5\0\1\106\1\0" + + "\1\106\1\0\5\106\1\107\1\106\2\0\2\106\1\0" + + "\1\106\1\0\24\106\1\0\20\106\2\u023f\1\0\2\106" + + "\4\0\2\106\1\0\1\106\1\0\1\106\5\0\1\106" + + "\1\0\1\11\1\0\2\106\3\11\1\107\1\11\2\0" + + "\1\106\1\11\1\0\1\11\1\0\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\u023f\1\u0240\1\0\1\106\1\11\4\0" + + "\1\106\1\11\1\0\1\11\1\0\1\11\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\4\54\2\u0241\16\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u0242\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\20\54" + + "\2\u0243\2\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\20\54\2\u0244\2\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\16\54\2\u0245\4\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\12\54\2\u0246\10\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\16\54" + + "\2\u0247\4\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u0248\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\u0249\1\0\1\54" + + "\1\0\24\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\7\0\1\u0239\6\0\1\u024a" + + "\1\u0239\5\0\1\u0239\62\0\1\u0239\1\0\1\u0239\16\0" + + "\1\u024a\101\0\1\106\1\0\1\106\1\0\5\106\1\107" + + "\1\106\2\0\2\106\1\0\1\106\1\0\6\106\2\u024b" + + "\14\106\1\0\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\106\1\0" + + "\5\106\1\107\1\106\2\0\2\106\1\0\1\106\1\0" + + "\24\106\1\u024c\22\106\1\0\2\106\4\0\2\106\1\0" + + "\1\106\1\0\1\106\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\u024b\1\u024d\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\0\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\106\1\0\1\11\1\0" + + "\2\106\3\11\1\107\1\11\2\0\1\106\1\11\1\0" + + "\1\11\1\0\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\u024c\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\0\1\106\1\11\4\0\1\106\1\11\1\0" + + "\1\11\1\0\1\11\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\20\54\2\u024e\2\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\24\54\1\0\10\54\2\u024f\10\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\2\54\2\u0250\20\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\5\0\1\54\1\0\1\54\1\0\5\54\1\0" + + "\1\54\2\0\2\54\1\0\1\54\1\0\2\54\2\u0251" + + "\20\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\4\54\2\u0252\16\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\14\54\2\u0253\6\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\24\54\1\0\2\u0254\20\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\16\54\2\u0255\4\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\106\1\0\1\106\1\0\5\106" + + "\1\107\1\106\2\0\2\106\1\0\1\106\1\0\24\106" + + "\1\u0256\22\106\1\0\2\106\4\0\2\106\1\0\1\106" + + "\1\0\1\106\7\0\1\u0257\7\0\1\u0258\5\0\1\u0257" + + "\62\0\1\u0257\1\0\1\u0257\5\0\1\106\1\0\1\11" + + "\1\0\2\106\3\11\1\107\1\11\2\0\1\106\1\11" + + "\1\0\1\11\1\0\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\106" + + "\1\11\1\106\1\11\1\106\1\11\1\106\1\11\1\u0256" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\106\1\11\1\106\1\11\1\106\1\11" + + "\1\106\1\11\1\0\1\106\1\11\4\0\1\106\1\11" + + "\1\0\1\11\1\0\1\11\5\0\1\54\1\0\1\54" + + "\1\0\5\54\1\0\1\54\2\0\2\54\1\0\1\54" + + "\1\0\2\54\2\u0259\20\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54\5\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\54" + + "\1\0\1\54\1\0\14\54\2\u025a\6\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u025b\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\u025c\1\0\1\54\1\0\24\54\1\0\22\54" + + "\1\0\2\54\4\0\2\54\1\0\1\54\1\0\1\54" + + "\5\0\1\54\1\0\1\54\1\0\5\54\1\0\1\54" + + "\2\0\2\54\1\0\1\54\1\0\20\54\2\u025d\2\54" + + "\1\0\22\54\1\0\2\54\4\0\2\54\1\0\1\54" + + "\1\0\1\54\5\0\1\54\1\0\1\54\1\0\5\54" + + "\1\0\1\54\2\0\2\54\1\0\1\54\1\0\14\54" + + "\2\u025e\6\54\1\0\22\54\1\0\2\54\4\0\2\54" + + "\1\0\1\54\1\0\1\54\7\0\1\u025f\7\0\1\u0260" + + "\5\0\1\u025f\62\0\1\u025f\1\0\1\u025f\7\0\1\u0257" + + "\6\0\1\u0261\1\u0257\5\0\1\u0257\62\0\1\u0257\1\0" + + "\1\u0257\16\0\1\u0261\101\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\u0262\1\0\1\54\1\0" + + "\24\54\1\0\22\54\1\0\2\54\4\0\2\54\1\0" + + "\1\54\1\0\1\54\5\0\1\54\1\0\1\54\1\0" + + "\5\54\1\0\1\54\2\0\2\54\1\0\1\54\1\0" + + "\16\54\2\u0263\4\54\1\0\22\54\1\0\2\54\4\0" + + "\2\54\1\0\1\54\1\0\1\54\5\0\1\54\1\0" + + "\1\54\1\0\5\54\1\0\1\54\2\0\2\54\1\0" + + "\1\54\1\0\2\54\2\u0264\20\54\1\0\22\54\1\0" + + "\2\54\4\0\2\54\1\0\1\54\1\0\1\54\5\0" + + "\1\54\1\0\1\54\1\0\5\54\1\0\1\54\2\0" + + "\2\54\1\0\1\54\1\0\16\54\2\u0265\4\54\1\0" + + "\22\54\1\0\2\54\4\0\2\54\1\0\1\54\1\0" + + "\1\54\7\0\1\u025f\6\0\1\u0266\1\u025f\5\0\1\u025f" + + "\62\0\1\u025f\1\0\1\u025f\16\0\1\u0266\101\0\1\54" + + "\1\0\1\54\1\0\5\54\1\0\1\54\2\0\2\u0267" + + "\1\0\1\54\1\0\24\54\1\0\22\54\1\0\2\54" + + "\4\0\2\54\1\0\1\54\1\0\1\54"; private static int[] zzUnpackTrans() { - int[] result = new int[2320]; + int[] result = new int[38550]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -360,14 +2449,33 @@ public final class Flasm3Lexer { */ private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\3\0\1\11\6\1\1\11\1\1\1\11\1\1\1\11" - + "\7\1\1\11\1\0\1\11\1\1\1\11\2\1\10\11" - + "\1\0\1\1\1\0\1\1\1\0\1\1\1\11\1\0" - + "\1\1\1\0\1\1\1\0\1\1\1\11\15\1\1\0" - + "\2\1\2\0\2\1\1\11\1\1\6\0\2\11"; + "\3\0\1\11\35\1\1\11\1\1\1\11\1\1\1\11" + + "\2\1\1\11\1\1\1\11\22\1\1\11\1\1\4\11" + + "\1\1\1\11\1\0\1\11\2\0\2\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\11\2\1\10\11\1\0" + + "\3\1\1\0\1\1\1\0\41\1\2\0\2\1\1\0" + + "\1\1\1\0\1\1\1\0\1\1\1\0\3\1\1\0" + + "\1\1\1\0\1\1\1\0\1\1\1\0\1\1\1\0" + + "\1\1\1\0\1\1\1\0\1\1\1\11\1\0\3\1" + + "\1\0\41\1\2\0\2\1\1\0\3\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\3\1\1\0\3\1" + + "\1\0\3\1\1\0\45\1\3\0\3\1\1\0\5\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\11\43\1\2\0\3\1\1\0\1\1\1\0\1\1" + + "\1\0\1\1\1\0\1\1\1\0\1\1\1\0\37\1" + + "\2\0\2\1\1\0\1\1\1\0\1\1\1\0\1\1" + + "\1\0\3\1\1\0\30\1\1\0\3\1\1\0\1\1" + + "\1\0\1\1\1\0\3\1\1\0\30\1\1\0\1\1" + + "\1\0\3\1\1\0\1\1\1\0\21\1\1\0\1\1" + + "\3\0\3\1\1\0\17\1\1\0\1\1\3\0\3\1" + + "\1\0\15\1\1\0\1\1\3\0\3\1\1\0\15\1" + + "\3\0\2\1\1\0\12\1\4\0\15\1\1\11\2\0" + + "\11\1\3\0\6\1\2\0\1\11\4\1\1\11\1\1"; private static int[] zzUnpackAttribute() { - int[] result = new int[81]; + int[] result = new int[615]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -465,6 +2573,23 @@ public final class Flasm3Lexer { public int yyline() { return yyline + 1; } + private Stack pushedBack = new Stack<>(); + + public void pushback(ParsedSymbol symb) { + pushedBack.push(symb); + last = null; + } + ParsedSymbol last; + + public ParsedSymbol lex() throws java.io.IOException, ParseException { + ParsedSymbol ret = null; + if (!pushedBack.isEmpty()) { + ret = last = pushedBack.pop(); + } else { + ret = last = yylex(); + } + return ret; + } /** * Creates a new scanner There is also a java.io.InputStream version of this @@ -496,7 +2621,7 @@ public final class Flasm3Lexer { char[] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 1738) { + while (i < 2260) { int count = packed.charAt(i++); char value = packed.charAt(i++); do { @@ -575,9 +2700,9 @@ public final class Flasm3Lexer { * 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 - * ZZ_INITIAL. + * All internal variables are reset, the old input stream + * cannot be reused (internal buffer is discarded and lost). Lexical + * state is set to ZZ_INITIAL. * * @param reader the new input stream */ @@ -812,43 +2937,184 @@ public final class Flasm3Lexer { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 45: { + isMultiname = true; + String s = yytext(); + multinameId = Long.parseLong(s.substring(2, s.length() - 2)); + yybegin(STRING); + string.setLength(0); + } + case 100: + break; + case 37: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPE, yytext()); + } + case 101: + break; + case 57: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DOUBLE, yytext()); + } + case 102: + break; + case 32: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CODE, yytext()); + } + case 103: + break; + case 52: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD, yytext()); + } + case 104: + break; + case 47: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CLASS, yytext()); + } + case 105: + break; + case 79: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMELA, yytext()); + } + case 106: + break; + case 74: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UINTEGER, yytext()); + } + case 107: + break; + case 59: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAMEA, yytext()); + } + case 108: + break; case 8: { return new ParsedSymbol(ParsedSymbol.TYPE_IDENTIFIER, yytext()); } - case 27: + case 109: break; - case 21: { - string.append('\''); + case 58: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_GETTER, yytext()); } - case 28: + case 110: break; - case 9: { - return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER, new Long(Long.parseLong((yytext())))); + case 53: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TARGET, yytext()); } - case 29: + case 111: break; - case 26: { - String s = yytext(); - return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_TARGET, Integer.parseInt(s.substring(16, s.length() - 1))); + case 69: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OVERRIDE, yytext()); } - case 30: + case 112: break; - case 3: { - string.append(yytext()); + case 92: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE, yytext()); } - case 31: + case 113: break; - case 13: { - char val = (char) Integer.parseInt(yytext().substring(1), 8); - string.append(val); + case 61: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INTEGER, yytext()); } - case 32: + case 114: break; - case 25: { + case 22: { + string.append('\t'); + } + case 115: + break; + case 94: { String s = yytext(); return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_START, Integer.parseInt(s.substring(15, s.length() - 1))); } - case 33: + case 116: + break; + case 54: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SETTER, yytext()); + } + case 117: + break; + case 15: { + return new ParsedSymbol(ParsedSymbol.TYPE_LOWERTHAN, yytext()); + } + case 118: + break; + case 19: { + throw new ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); + } + case 119: + break; + case 42: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UTF8, yytext()); + } + case 120: + break; + case 95: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE, yytext()); + } + case 121: + break; + case 89: { + String s = yytext(); + return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_END, Integer.parseInt(s.substring(13, s.length() - 1))); + } + case 122: + break; + case 35: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_BODY, yytext()); + } + case 123: + break; + case 34: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FLAG, yytext()); + } + case 124: + break; + case 83: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMELA, yytext()); + } + case 125: + break; + case 78: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAMESPACE, yytext()); + } + case 126: + break; + case 93: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE, yytext()); + } + case 127: + break; + case 9: { + return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_OPEN, yytext()); + } + case 128: + break; + case 91: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_PARAM_NAMES, yytext()); + } + case 129: + break; + case 23: { + string.append('\n'); + } + case 130: + break; + case 64: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSTACK, yytext()); + } + case 131: + break; + case 36: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRUE, yytext()); + } + case 132: break; case 5: { yybegin(PARAMETERS); @@ -859,105 +3125,353 @@ public final class Flasm3Lexer { return new ParsedSymbol(ParsedSymbol.TYPE_STRING, string.toString()); } } - case 34: + case 133: break; - case 6: { - yybegin(YYINITIAL); + case 44: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRAIT, yytext()); } - case 35: + case 134: + break; + case 97: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS, yytext()); + } + case 135: + break; + case 80: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UNDEFINED, yytext()); + } + case 136: + break; + case 67: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICIT, yytext()); + } + case 137: + break; + case 4: { + throw new ParseException("Unterminated string at end of line", yyline + 1); + } + case 138: + break; + case 10: { + return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER, new Long(Long.parseLong((yytext())))); + } + case 139: + break; + case 31: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRY, yytext()); + } + case 140: + break; + case 60: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RETURNS, yytext()); + } + case 141: + break; + case 88: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ARGUMENTS, yytext()); + } + case 142: + break; + case 43: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAM, yytext()); + } + case 143: + break; + case 98: { + String s = yytext(); + return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_TARGET, Integer.parseInt(s.substring(16, s.length() - 1))); + } + case 144: + break; + case 56: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DISPID, yytext()); + } + case 145: + break; + case 66: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METADATA, yytext()); + } + case 146: + break; + case 18: { + String s = yytext(); + return new ParsedSymbol(ParsedSymbol.TYPE_LABEL, s.substring(0, s.length() - 1)); + } + case 147: + break; + case 76: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAME, yytext()); + } + case 148: + break; + case 72: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEL, yytext()); + } + case 149: + break; + case 85: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_OPTIONAL, yytext()); + } + case 150: + break; + case 29: { + return new ParsedSymbol(ParsedSymbol.TYPE_FLOAT, new Double(Double.parseDouble((yytext())))); + } + case 151: + break; + case 30: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TO, yytext()); + } + case 152: + break; + case 46: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CONST, yytext()); + } + case 153: + break; + case 24: { + string.append('\r'); + } + case 154: + break; + case 48: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FINAL, yytext()); + } + case 155: + break; + case 63: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DECIMAL, yytext()); + } + case 156: + break; + case 26: { + string.append('\b'); + } + case 157: + break; + case 86: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSCOPEDEPTH, yytext()); + } + case 158: + break; + case 49: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FALSE, yytext()); + } + case 159: + break; + case 73: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FUNCTION, yytext()); + } + case 160: + break; + case 27: { + string.append('\"'); + } + case 161: + break; + case 70: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SET_DXNS, yytext()); + } + case 162: + break; + case 39: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NULL, yytext()); + } + case 163: + break; + case 87: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INITSCOPEDEPTH, yytext()); + } + case 164: + break; + case 41: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FROM, yytext()); + } + case 165: + break; + case 14: { + return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_CLOSE, yytext()); + } + case 166: break; case 2: { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_INSTRUCTION_NAME, yytext()); } - case 36: + case 167: break; - case 17: { - string.append('\r'); + case 28: { + string.append('\''); } - case 37: - break; - case 24: { - String s = yytext(); - return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_END, Integer.parseInt(s.substring(13, s.length() - 1))); - } - case 38: - break; - case 7: { - return new ParsedSymbol(ParsedSymbol.TYPE_COMMENT, yytext().substring(1)); - } - case 39: - break; - case 19: { - string.append('\b'); - } - case 40: + case 168: break; case 11: { - String s = yytext(); - return new ParsedSymbol(ParsedSymbol.TYPE_LABEL, s.substring(0, s.length() - 1)); + return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_CLOSE, yytext()); } - case 41: + case 169: break; - case 4: { - throw new ParseException("Unterminated string at end of line", yyline + 1); + case 21: { + string.append('\\'); } - case 42: + case 170: break; - case 10: { + case 6: { + yybegin(YYINITIAL); + } + case 171: + break; + case 17: { + return new ParsedSymbol(ParsedSymbol.TYPE_COMMA, yytext()); + } + case 172: + break; + case 96: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS, yytext()); + } + case 173: + break; + case 16: { + return new ParsedSymbol(ParsedSymbol.TYPE_GREATERTHAN, yytext()); + } + case 174: + break; + case 77: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_REST, yytext()); + } + case 175: + break; + case 12: { isMultiname = false; yybegin(STRING); string.setLength(0); } - case 43: + case 176: break; - case 15: { - string.append('\t'); + case 68: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPENAME, yytext()); } - case 44: + case 177: break; - case 22: { - return new ParsedSymbol(ParsedSymbol.TYPE_FLOAT, new Double(Double.parseDouble((yytext())))); + case 40: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOT, yytext()); } - case 45: + case 178: break; - case 14: { - string.append('\\'); + case 99: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE, yytext()); } - case 46: + case 179: break; - case 12: { - throw new ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); + case 75: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAMNAME, yytext()); } - case 47: + case 180: break; - case 23: { - isMultiname = true; - String s = yytext(); - multinameId = Long.parseLong(s.substring(2, s.length() - 2)); - yybegin(STRING); - string.setLength(0); - } - case 48: - break; - case 16: { - string.append('\n'); - } - case 49: - break; - case 20: { + case 25: { string.append('\f'); } - case 50: + case 181: break; - case 18: { - string.append('\"'); + case 13: { + return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_OPEN, yytext()); } - case 51: + case 182: + break; + case 33: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME, yytext()); + } + case 183: + break; + case 90: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ACTIVATION, yytext()); + } + case 184: + break; + case 51: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_VALUE, yytext()); + } + case 185: + break; + case 55: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOTID, yytext()); + } + case 186: + break; + case 84: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_IGNORE_REST, yytext()); + } + case 187: + break; + case 50: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAME, yytext()); + } + case 188: + break; + case 3: { + string.append(yytext()); + } + case 189: + break; + case 7: { + return new ParsedSymbol(ParsedSymbol.TYPE_COMMENT, yytext().substring(1)); + } + case 190: + break; + case 81: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_LOCALCOUNT, yytext()); + } + case 191: + break; + case 71: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEA, yytext()); + } + case 192: + break; + case 65: { + yybegin(PARAMETERS); + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OPTIONAL, yytext()); + } + case 193: + break; + case 20: { + char val = (char) Integer.parseInt(yytext().substring(1), 8); + string.append(val); + } + case 194: + break; + case 38: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME, yytext()); + } + case 195: + break; + case 82: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMEL, yytext()); + } + case 196: + break; + case 62: { + return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAME, yytext()); + } + case 197: break; case 1: { } - case 52: + case 198: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java index 18f0815c0..e8a7f468d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/ParsedSymbol.java @@ -32,6 +32,79 @@ public class ParsedSymbol { public static final int TYPE_EXCEPTION_START = 10; public static final int TYPE_EXCEPTION_END = 11; public static final int TYPE_EXCEPTION_TARGET = 12; + public static final int TYPE_KEYWORD_QNAME = 13; + public static final int TYPE_KEYWORD_QNAMEA = 14; + public static final int TYPE_KEYWORD_RTQNAME = 15; + public static final int TYPE_KEYWORD_RTQNAMEA = 16; + public static final int TYPE_KEYWORD_RTQNAMEL = 17; + public static final int TYPE_KEYWORD_RTQNAMELA = 18; + public static final int TYPE_KEYWORD_MULTINAME = 19; + public static final int TYPE_KEYWORD_MULTINAMEA = 20; + public static final int TYPE_KEYWORD_MULTINAMEL = 21; + public static final int TYPE_KEYWORD_MULTINAMELA = 22; + public static final int TYPE_KEYWORD_TYPENAME = 23; + public static final int TYPE_PARENT_OPEN = 24; + public static final int TYPE_PARENT_CLOSE = 25; + public static final int TYPE_COMMA = 26; + public static final int TYPE_KEYWORD_NULL = 27; + public static final int TYPE_BRACKET_OPEN = 28; + public static final int TYPE_BRACKET_CLOSE = 29; + public static final int TYPE_LOWERTHAN = 30; + public static final int TYPE_GREATERTHAN = 31; + public static final int TYPE_KEYWORD_NAMESPACE = 32; + public static final int TYPE_KEYWORD_PRIVATENAMESPACE = 33; + public static final int TYPE_KEYWORD_PACKAGENAMESPACE = 34; + public static final int TYPE_KEYWORD_PACKAGEINTERNALNS = 35; + public static final int TYPE_KEYWORD_PROTECTEDNAMESPACE = 36; + public static final int TYPE_KEYWORD_EXPLICITNAMESPACE = 37; + public static final int TYPE_KEYWORD_STATICPROTECTEDNS = 38; + public static final int TYPE_KEYWORD_TRY = 39; + public static final int TYPE_KEYWORD_FROM = 40; + public static final int TYPE_KEYWORD_TO = 41; + public static final int TYPE_KEYWORD_TARGET = 42; + public static final int TYPE_KEYWORD_TYPE = 43; + public static final int TYPE_KEYWORD_NAME = 44; + public static final int TYPE_KEYWORD_FLAG = 45; + public static final int TYPE_KEYWORD_EXPLICIT = 46; + public static final int TYPE_KEYWORD_HAS_OPTIONAL = 47; + public static final int TYPE_KEYWORD_HAS_PARAM_NAMES = 48; + public static final int TYPE_KEYWORD_IGNORE_REST = 49; + public static final int TYPE_KEYWORD_NEED_ACTIVATION = 50; + public static final int TYPE_KEYWORD_NEED_ARGUMENTS = 51; + public static final int TYPE_KEYWORD_NEED_REST = 52; + public static final int TYPE_KEYWORD_SET_DXNS = 53; + public static final int TYPE_KEYWORD_PARAM = 54; + public static final int TYPE_KEYWORD_PARAMNAME = 55; + public static final int TYPE_KEYWORD_OPTIONAL = 56; + public static final int TYPE_KEYWORD_RETURNS = 57; + public static final int TYPE_KEYWORD_BODY = 58; + public static final int TYPE_KEYWORD_MAXSTACK = 59; + public static final int TYPE_KEYWORD_LOCALCOUNT = 60; + public static final int TYPE_KEYWORD_INITSCOPEDEPTH = 61; + public static final int TYPE_KEYWORD_MAXSCOPEDEPTH = 62; + public static final int TYPE_KEYWORD_CODE = 63; + public static final int TYPE_KEYWORD_INTEGER = 64; + public static final int TYPE_KEYWORD_UINTEGER = 65; + public static final int TYPE_KEYWORD_DOUBLE = 66; + public static final int TYPE_KEYWORD_DECIMAL = 67; + public static final int TYPE_KEYWORD_UTF8 = 68; + public static final int TYPE_KEYWORD_TRUE = 69; + public static final int TYPE_KEYWORD_FALSE = 70; + public static final int TYPE_KEYWORD_UNDEFINED = 71; + public static final int TYPE_KEYWORD_TRAIT = 72; + public static final int TYPE_KEYWORD_SLOT = 73; + public static final int TYPE_KEYWORD_CONST = 74; + public static final int TYPE_KEYWORD_METHOD = 75; + public static final int TYPE_KEYWORD_GETTER = 76; + public static final int TYPE_KEYWORD_SETTER = 77; + public static final int TYPE_KEYWORD_CLASS = 78; + public static final int TYPE_KEYWORD_FUNCTION = 79; + public static final int TYPE_KEYWORD_DISPID = 80; + public static final int TYPE_KEYWORD_SLOTID = 81; + public static final int TYPE_KEYWORD_VALUE = 82; + public static final int TYPE_KEYWORD_FINAL = 83; + public static final int TYPE_KEYWORD_METADATA = 84; + public static final int TYPE_KEYWORD_OVERRIDE = 85; public ParsedSymbol(int type, Object value) { this.type = type; diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex index b00259707..8b61417ec 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/flasm3.flex @@ -2,12 +2,14 @@ package com.jpexs.decompiler.flash.abc.avm2.parser; +import java.util.Stack; %% %public %class Flasm3Lexer %final %unicode +%ignorecase %char %line %column @@ -37,6 +39,26 @@ package com.jpexs.decompiler.flash.abc.avm2.parser; return yyline+1; } + + + private Stack pushedBack=new Stack<>(); + + + public void pushback(ParsedSymbol symb) { + pushedBack.push(symb); + last = null; + } + ParsedSymbol last; + public ParsedSymbol lex() throws java.io.IOException, ParseException{ + ParsedSymbol ret=null; + if(!pushedBack.isEmpty()){ + ret = last = pushedBack.pop(); + }else{ + ret = last = yylex(); + } + return ret; + } + %} /* main character classes */ @@ -107,7 +129,23 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" String s=yytext(); return new ParsedSymbol(ParsedSymbol.TYPE_LABEL,s.substring(0,s.length()-1)); } - + "name" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME,yytext());} + "try" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRY,yytext());} + "flag" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FLAG,yytext());} + "param" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAM,yytext());} + "paramname" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAMNAME,yytext());} + "optional" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OPTIONAL,yytext());} + "returns" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RETURNS,yytext());} + "body" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_BODY,yytext());} + "maxstack" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSTACK,yytext());} + "localcount" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_LOCALCOUNT,yytext());} + "initscopedepth" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INITSCOPEDEPTH,yytext());} + "maxscopedepth" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSCOPEDEPTH,yytext());} + "code" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CODE,yytext());} + "trait" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRAIT,yytext());} + "method" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD,yytext());} + + /* identifiers */ {InstructionName} { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_INSTRUCTION_NAME,yytext()); @@ -128,7 +166,78 @@ ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":" yybegin(STRING); string.setLength(0); } + /* multinames */ + "QName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAME,yytext());} + "QNameA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAMEA,yytext());} + "RTQName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAME,yytext());} + "RTQNameA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEA,yytext());} + "RTQNameL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEL,yytext());} + "RTQNameLA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMELA,yytext());} + "Multiname" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAME,yytext());} + "MultinameL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMEL,yytext());} + "MultinameLA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMELA,yytext());} + "TypeName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPENAME,yytext());} + "null" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NULL,yytext());} + "(" { return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_OPEN,yytext());} + ")" { return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_CLOSE,yytext());} + "[" { return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_OPEN,yytext());} + "]" { return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_CLOSE,yytext());} + "<" { return new ParsedSymbol(ParsedSymbol.TYPE_LOWERTHAN,yytext());} + ">" { return new ParsedSymbol(ParsedSymbol.TYPE_GREATERTHAN,yytext());} + "Namespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAMESPACE,yytext());} + "PrivateNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE,yytext());} + "PackageNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE,yytext());} + "PackageInternalNs" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS,yytext());} + "ProtectedNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE,yytext());} + "ExplicitNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE,yytext());} + "StaticProtectedNs" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS,yytext());} + "," { return new ParsedSymbol(ParsedSymbol.TYPE_COMMA,yytext());} + /*Try*/ + "from" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FROM,yytext());} + "to" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TO,yytext());} + "target" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TARGET,yytext());} + "name" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME,yytext());} + "type" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPE,yytext());} + + "slot" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOT,yytext());} + "const" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CONST,yytext());} + "method" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD,yytext());} + "getter" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_GETTER,yytext());} + "setter" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SETTER,yytext());} + "class" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CLASS,yytext());} + "function" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FUNCTION,yytext());} + "dispid" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DISPID,yytext());} + "slotid" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOTID,yytext());} + "value" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_VALUE,yytext());} + + + + /*Flags*/ + "EXPLICIT" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICIT,yytext());} + "HAS_OPTIONAL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_OPTIONAL,yytext());} + "HAS_PARAM_NAMES" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_PARAM_NAMES,yytext());} + "IGNORE_REST" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_IGNORE_REST,yytext());} + "NEED_ACTIVATION" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ACTIVATION,yytext());} + "NEED_ARGUMENTS" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ARGUMENTS,yytext());} + "NEED_REST" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_REST,yytext());} + "SET_DXNS" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SET_DXNS,yytext());} + + /* Value types*/ + "Integer" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INTEGER,yytext());} + "UInteger" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UINTEGER,yytext());} + "Double" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DOUBLE,yytext());} + "Decimal" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DECIMAL,yytext());} + "Utf8" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UTF8,yytext());} + "True" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRUE,yytext());} + "False" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FALSE,yytext());} + "Undefined" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UNDEFINED,yytext());} + + + "FINAL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FINAL,yytext());} + "OVERRIDE" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OVERRIDE,yytext());} + "METADATA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METADATA,yytext());} + /* numeric literals */ {NumberLiteral} { return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER,new Long(Long.parseLong((yytext())))); } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java index e257ffb6e..13a624de7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodBody.java @@ -21,6 +21,7 @@ import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.CodeStats; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.helpers.Highlighting; @@ -70,16 +71,16 @@ public class MethodBody implements Cloneable, Serializable { return s; } - public int removeDeadCode(ConstantPool constants) { - return code.removeDeadCode(constants, this); + public int removeDeadCode(ConstantPool constants, Trait trait, MethodInfo info) { + return code.removeDeadCode(constants, trait, info, this); } - public void restoreControlFlow(ConstantPool constants) { - code.restoreControlFlow(constants, this); + public void restoreControlFlow(ConstantPool constants, Trait trait, MethodInfo info) { + code.restoreControlFlow(constants, trait, info, this); } - public int removeTraps(ConstantPool constants, ABC abc, int scriptIndex, int classIndex, boolean isStatic, String path) { - return code.removeTraps(constants, this, abc, scriptIndex, classIndex, isStatic, path); + public int removeTraps(ConstantPool constants, ABC abc, Trait trait, int scriptIndex, int classIndex, boolean isStatic, String path) { + return code.removeTraps(constants, trait, abc.method_info[method_info], this, abc, scriptIndex, classIndex, isStatic, path); } public HashMap getLocalRegNames(ABC abc) { @@ -108,13 +109,13 @@ public class MethodBody implements Cloneable, Serializable { return ret; } - public String toString(final String path, boolean pcode, final boolean isStatic, final int scriptIndex, final int classIndex, final ABC abc, final ConstantPool constants, final MethodInfo[] method_info, final Stack scopeStack, final boolean isStaticInitializer, final boolean hilight, final boolean replaceIndents, final List fullyQualifiedNames, final Traits initTraits) { + public String toString(final String path, boolean pcode, final boolean isStatic, final int scriptIndex, final int classIndex, final ABC abc, final Trait trait, final ConstantPool constants, final MethodInfo[] method_info, final Stack scopeStack, final boolean isStaticInitializer, final boolean hilight, final boolean replaceIndents, final List fullyQualifiedNames, final Traits initTraits) { if (debugMode) { System.err.println("Decompiling " + path); } String s = ""; if (pcode) { - s += code.toASMSource(constants, this, false, hilight); + s += code.toASMSource(constants, trait, method_info[this.method_info], this, false, hilight); } else { if (!Configuration.getConfig("decompile", true)) { s = "//Decompilation skipped"; @@ -128,7 +129,7 @@ public class MethodBody implements Cloneable, Serializable { s += Helper.timedCall(new Callable() { @Override public String call() throws Exception { - return toSource(path, isStatic, scriptIndex, classIndex, abc, constants, method_info, scopeStack, isStaticInitializer, hilight, replaceIndents, fullyQualifiedNames, initTraits); + return toSource(path, isStatic, scriptIndex, classIndex, abc, trait, constants, method_info, scopeStack, isStaticInitializer, hilight, replaceIndents, fullyQualifiedNames, initTraits); } }, timeout, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException ex) { @@ -139,14 +140,14 @@ public class MethodBody implements Cloneable, Serializable { return s; } - public String toSource(String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, ConstantPool constants, MethodInfo[] method_info, Stack scopeStack, boolean isStaticInitializer, boolean hilight, boolean replaceIndents, List fullyQualifiedNames, Traits initTraits) { + public String toSource(String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, Trait trait, ConstantPool constants, MethodInfo[] method_info, Stack scopeStack, boolean isStaticInitializer, boolean hilight, boolean replaceIndents, List fullyQualifiedNames, Traits initTraits) { AVM2Code deobfuscated = null; MethodBody b = (MethodBody) Helper.deepCopy(this); deobfuscated = b.code; deobfuscated.markMappedOffsets(); if (Configuration.getConfig("autoDeobfuscate", true)) { try { - deobfuscated.removeTraps(constants, b, abc, scriptIndex, classIndex, isStatic, path); + deobfuscated.removeTraps(constants, trait, method_info[this.method_info], b, abc, scriptIndex, classIndex, isStatic, path); } catch (Exception | StackOverflowError ex) { Logger.getLogger(MethodBody.class.getName()).log(Level.SEVERE, "Error during remove traps in " + path, ex); } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java index ce07d68bb..4b50387c1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/MethodInfo.java @@ -34,6 +34,18 @@ public class MethodInfo { public int[] paramNames; private MethodBody body; + public void setFlagIgnore_Rest() { + flags |= 16; + } + + public void setFlagExplicit() { + flags |= 32; + } + + public void setFlagNeed_Arguments() { + flags |= 1; + } + public void setFlagSetsdxns() { flags |= 64; } @@ -140,7 +152,7 @@ public class MethodInfo { return (flags & 8) == 8; } - public boolean flagIgnore_restHas_optional() { + public boolean flagIgnore_rest() { return (flags & 16) == 16; } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java index 822ad01a2..4153a3cc0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/Multiname.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.abc.types; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; +import com.jpexs.helpers.Helper; import java.util.List; public class Multiname { @@ -135,42 +136,80 @@ public class Multiname { } - public String toString(ConstantPool constants, List fullyQualifiedNames) { - String kindStr = "?"; - for (int k = 0; k < multinameKinds.length; k++) { - if (multinameKinds[k] == kind) { - kindStr = multinameKindNames[k] + " "; + private static String namespaceToString(ConstantPool constants, int index) { + if (index == 0) { + return "null"; + } + int type = constants.constant_namespace[index].kind; + String name = constants.constant_namespace[index].getName(constants); + int sub = -1; + for (int n = 1; n < constants.constant_namespace.length; n++) { + if (constants.constant_namespace[n].kind == type && constants.constant_namespace[n].getName(constants).equals(name)) { + sub++; + } + if (n == index) { break; } } - String nameStr = ""; - if (name_index > 0) { - nameStr = constants.constant_string[name_index]; - } - if (name_index == 0) { - nameStr = "*"; - } - String namespaceStr = ""; - if (namespace_index > 0) { - namespaceStr = constants.constant_namespace[namespace_index].toString(constants); - } - if (!namespaceStr.equals("")) { - namespaceStr = namespaceStr + "."; - } - if (namespace_index == 0) { - namespaceStr = "*."; - } - String namespaceSetStr = ""; - if (namespace_set_index > 0) { - namespaceSetStr = " "; - } - String typeNameStr = ""; - if (kind == TYPENAME) { - typeNameStr = typeNameToStr(constants, fullyQualifiedNames); - } + return constants.constant_namespace[index].getKindStr() + "(" + "\"" + Helper.escapeString(name) + "\"" + (sub > 0 ? ",\"" + sub + "\"" : "") + ")"; + } - return namespaceStr + nameStr + namespaceSetStr + typeNameStr; + private static String namespaceSetToString(ConstantPool constants, int index) { + if (index == 0) { + return "null"; + } + String ret = "["; + for (int n = 0; n < constants.constant_namespace_set[index].namespaces.length; n++) { + if (n > 0) { + ret += ","; + } + int ns = constants.constant_namespace_set[index].namespaces[n]; + ret += namespaceToString(constants, ns); + } + ret += "]"; + return ret; + } + private static String multinameToString(ConstantPool constants, int index, List fullyQualifiedNames) { + if (index == 0) { + return "null"; + } + return constants.constant_multiname[index].toString(constants, fullyQualifiedNames); + } + + public String toString(ConstantPool constants, List fullyQualifiedNames) { + + switch (kind) { + case QNAME: + case QNAMEA: + return getKindStr() + "(" + namespaceToString(constants, namespace_index) + "," + "\"" + Helper.escapeString(constants.constant_string[name_index]) + "\"" + ")"; + case RTQNAME: + case RTQNAMEA: + return getKindStr() + "(" + "\"" + Helper.escapeString(constants.constant_string[name_index]) + "\"" + ")"; + case RTQNAMEL: + case RTQNAMELA: + return getKindStr() + "()"; + case MULTINAME: + case MULTINAMEA: + return getKindStr() + "(" + "\"" + Helper.escapeString(constants.constant_string[name_index]) + "\"" + "," + namespaceSetToString(constants, namespace_set_index) + ")"; + case MULTINAMEL: + case MULTINAMELA: + return getKindStr() + "(" + namespaceSetToString(constants, namespace_set_index) + ")"; + case TYPENAME: + String tret = getKindStr() + "("; + tret += multinameToString(constants, qname_index, fullyQualifiedNames); + tret += "<"; + for (int i = 0; i < params.size(); i++) { + if (i > 0) { + tret += ","; + } + tret += multinameToString(constants, params.get(i), fullyQualifiedNames); + } + tret += ">"; + tret += ")"; + return tret; + } + return null; } private String typeNameToStr(ConstantPool constants, List fullyQualifiedNames) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java index ece189934..be9222810 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/Namespace.java @@ -29,7 +29,7 @@ public class Namespace { public static final int KIND_EXPLICIT = 25; public static final int KIND_STATIC_PROTECTED = 26; public static final int[] nameSpaceKinds = new int[]{KIND_NAMESPACE, KIND_PRIVATE, KIND_PACKAGE, KIND_PACKAGE_INTERNAL, KIND_PROTECTED, KIND_EXPLICIT, KIND_STATIC_PROTECTED}; - public static final String[] nameSpaceKindNames = new String[]{"Namespace", "PrivateNamespace", "PackageNamespace", "PackageInternalNamespace", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNamespace"}; + public static final String[] nameSpaceKindNames = new String[]{"Namespace", "PrivateNamespace", "PackageNamespace", "PackageInternalNs", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNs"}; public static final String[] namePrefixes = new String[]{"", "private", "public", "", "protected", "explicit", "protected"}; public int kind; public int name_index; diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java index 8d9ab7074..85a2904c3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/NamespaceSet.java @@ -22,6 +22,13 @@ public class NamespaceSet { public int[] namespaces; + public NamespaceSet() { + } + + public NamespaceSet(int[] namespaces) { + this.namespaces = namespaces; + } + public String toString(ConstantPool constants) { String s = ""; for (int i = 0; i < this.namespaces.length; i++) { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java index c67115002..b3e353019 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/ValueKind.java @@ -38,7 +38,7 @@ public class ValueKind { public static final int CONSTANT_StaticProtectedNs = 0x1A;// Namespace public static final int CONSTANT_PrivateNs = 0x05;// namespace private static final int[] optionalKinds = new int[]{0x03, 0x04, 0x06, 0x02, 0x01, 0x0B, 0x0A, 0x0C, 0x00, 0x08, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x05}; - private static final String[] optionalKindNames = new String[]{"Int", "UInt", "Double", "Decimal", "Utf8", "True", "False", "Null", "Undefined", "Namespace", "PackageNamespace", "PackageInternalNs", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNs", "PrivateNs"}; + private static final String[] optionalKindNames = new String[]{"Int", "UInt", "Double", "Decimal", "Utf8", "True", "False", "Null", "Undefined", "Namespace", "PackageNamespace", "PackageInternalNs", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNs", "PrivateNamespace"}; public int value_index; public int value_kind; @@ -120,4 +120,46 @@ public class ValueKind { } return ret; } + + public String toASMString(ConstantPool constants) { + String ret = "?"; + switch (value_kind) { + case CONSTANT_Int: + ret = "Integer(" + constants.constant_int[value_index] + ")"; + break; + case CONSTANT_UInt: + ret = "UInteger(" + constants.constant_uint[value_index] + ")"; + break; + case CONSTANT_Double: + ret = "Double(" + constants.constant_double[value_index] + ")"; + break; + case CONSTANT_Decimal: + ret = "Decimal(" + constants.constant_decimal[value_index] + ")"; + break; + case CONSTANT_Utf8: + ret = "Utf8(\"" + Helper.escapeString(constants.constant_string[value_index]) + "\")"; + break; + case CONSTANT_True: + ret = "True"; + break; + case CONSTANT_False: + ret = "False"; + break; + case CONSTANT_Null: + ret = "Null"; + break; + case CONSTANT_Undefined: + ret = "Undefined"; + break; + case CONSTANT_Namespace: + case CONSTANT_PackageInternalNs: + case CONSTANT_ProtectedNamespace: + case CONSTANT_ExplicitNamespace: + case CONSTANT_StaticProtectedNs: + case CONSTANT_PrivateNs: + ret = constants.constant_namespace[value_index].getKindStr() + "(\"" + constants.constant_namespace[value_index].getName(constants) + "\")"; + break; + } + return ret; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java index 681fac508..ab64eb9dc 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitClass.java @@ -445,7 +445,7 @@ public class TraitClass extends Trait implements TraitWithSlot { String bodyStr = ""; bodyIndex = abc.findBodyIndex(abc.class_info[class_info].cinit_index); if (bodyIndex != -1) { - bodyStr = abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".staticinitializer", pcode, true, scriptIndex, class_info, abc, abc.constants, abc.method_info, new Stack(), true, highlight, true, fullyQualifiedNames, abc.class_info[class_info].static_traits); + bodyStr = abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".staticinitializer", pcode, true, scriptIndex, class_info, abc, this, abc.constants, abc.method_info, new Stack(), true, highlight, true, fullyQualifiedNames, abc.class_info[class_info].static_traits); } if (Highlighting.stripHilights(bodyStr).trim().equals("")) { toPrint = ABC.addTabs(bodyStr + "/*classInitializer*/", 3); @@ -479,7 +479,7 @@ public class TraitClass extends Trait implements TraitWithSlot { bodyStr = ""; bodyIndex = abc.findBodyIndex(abc.instance_info[class_info].iinit_index); if (bodyIndex != -1) { - bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".initializer", pcode, false, scriptIndex, class_info, abc, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, abc.instance_info[class_info].instance_traits), 3); + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path +/*packageName +*/ "/" + abc.instance_info[class_info].getName(abc.constants).getName(abc.constants, fullyQualifiedNames) + ".initializer", pcode, false, scriptIndex, class_info, abc, this, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, abc.instance_info[class_info].instance_traits), 3); constructorParams = abc.method_info[abc.instance_info[class_info].iinit_index].getParamStr(abc.constants, abc.bodies[bodyIndex], abc, fullyQualifiedNames); } else { constructorParams = abc.method_info[abc.instance_info[class_info].iinit_index].getParamStr(abc.constants, null, abc, fullyQualifiedNames); @@ -548,11 +548,11 @@ public class TraitClass extends Trait implements TraitWithSlot { int iInitializer = abc.findBodyIndex(abc.instance_info[class_info].iinit_index); int ret = 0; if (iInitializer != -1) { - ret += abc.bodies[iInitializer].removeTraps(abc.constants, abc, scriptIndex, class_info, false, path); + ret += abc.bodies[iInitializer].removeTraps(abc.constants, abc, this, scriptIndex, class_info, false, path); } int sInitializer = abc.findBodyIndex(abc.class_info[class_info].cinit_index); if (sInitializer != -1) { - ret += abc.bodies[sInitializer].removeTraps(abc.constants, abc, scriptIndex, class_info, true, path); + ret += abc.bodies[sInitializer].removeTraps(abc.constants, abc, this, scriptIndex, class_info, true, path); } ret += abc.instance_info[class_info].instance_traits.removeTraps(scriptIndex, class_info, false, abc, path); ret += abc.class_info[class_info].static_traits.removeTraps(scriptIndex, class_info, true, abc, path); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java index bfc4ffba7..a02e0ba72 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitFunction.java @@ -56,7 +56,7 @@ public class TraitFunction extends Trait implements TraitWithSlot { String bodyStr = ""; int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + abc.constants.constant_multiname[name_index].getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + abc.constants.constant_multiname[name_index].getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, this, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); } return Graph.INDENT_STRING + Graph.INDENT_STRING + header + (abc.instance_info[classIndex].isInterface() ? ";" : " {\r\n" + bodyStr + "\r\n" + Graph.INDENT_STRING + Graph.INDENT_STRING + "}"); @@ -66,7 +66,7 @@ public class TraitFunction extends Trait implements TraitWithSlot { public int removeTraps(int scriptIndex, int classIndex, boolean isStatic, ABC abc, String path) { int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, scriptIndex, classIndex, isStatic, path); + return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, this, scriptIndex, classIndex, isStatic, path); } return 0; } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index 87f2ac11d..f774ea97d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -60,7 +60,7 @@ public class TraitMethodGetterSetter extends Trait { String bodyStr = ""; int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); + bodyStr = ABC.addTabs(abc.bodies[bodyIndex].toString(path + "." + getName(abc).getName(abc.constants, fullyQualifiedNames), pcode, isStatic, scriptIndex, classIndex, abc, this, abc.constants, abc.method_info, new Stack(), false, highlight, true, fullyQualifiedNames, null), 3); } return Graph.INDENT_STRING + Graph.INDENT_STRING + header + ((classIndex != -1 && abc.instance_info[classIndex].isInterface()) ? ";" : " {\r\n" + bodyStr + "\r\n" + Graph.INDENT_STRING + Graph.INDENT_STRING + "}"); } @@ -69,7 +69,7 @@ public class TraitMethodGetterSetter extends Trait { public int removeTraps(int scriptIndex, int classIndex, boolean isStatic, ABC abc, String path) { int bodyIndex = abc.findBodyIndex(method_info); if (bodyIndex != -1) { - return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, scriptIndex, classIndex, isStatic, path); + return abc.bodies[bodyIndex].removeTraps(abc.constants, abc, this, scriptIndex, classIndex, isStatic, path); } return 0; } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java index 33473d67c..6fa1b164e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/types/traits/Traits.java @@ -127,7 +127,7 @@ public class Traits implements Serializable { ExecutorService executor = null; List> futureResults = null; List traitConvertTasks = null; - + if (parallel) { executor = Executors.newFixedThreadPool(20); futureResults = new ArrayList<>(); diff --git a/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java b/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java index 24a69a1b7..9b37c366b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/ActionListReader.java @@ -81,7 +81,7 @@ public class ActionListReader { */ public static List readActionList(List listeners, long containerSWFOffset, ReReadableInputStream rri, int version, int ip, int endIp, String path) throws IOException { boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); - + ConstantPool cpool = new ConstantPool(); SWFInputStream sis = new SWFInputStream(rri, version); @@ -89,8 +89,8 @@ public class ActionListReader { // List of the actions. N. item contains the action which starts in offset N. List actionMap = new ArrayList<>(); List nextOffsets = new ArrayList<>(); - Action entryAction = readActionListAtPos(listeners, containerSWFOffset, cpool, - sis, rri, + Action entryAction = readActionListAtPos(listeners, containerSWFOffset, cpool, + sis, rri, actionMap, nextOffsets, ip, ip, endIp, version, path, false, new ArrayList()); @@ -107,7 +107,7 @@ public class ActionListReader { jump.setJumpOffset((int) (entryAction.getAddress() - size)); actions.add(jump); } - + // remove nulls index = getNextNotNullIndex(actionMap, index); while (index > -1) { @@ -126,7 +126,7 @@ public class ActionListReader { } index = nextIndex; } - + // Map for storing the targers of the "jump" actions // "jump" action can be ActionIf, ActionJump and any ActionStore Map jumps = new HashMap<>(); @@ -137,7 +137,7 @@ public class ActionListReader { updateActionStores(actions, jumps); updateContainerSizes(actions, containerLastActions); updateActionLengths(actions, version); - + // add end action Action lastAction = actions.get(actions.size() - 1); if (!(lastAction instanceof ActionEnd)) { @@ -153,7 +153,7 @@ public class ActionListReader { return actions; } - + /** * Reads list of actions from the stream. Reading ends with * ActionEndFlag(=0) or end of the stream. @@ -173,7 +173,7 @@ public class ActionListReader { byte[] data = Action.actionsToBytes(actions, true, version); ReReadableInputStream rri = new ReReadableInputStream(new ByteArrayInputStream(data)); int endIp = data.length; - + List retdups = new ArrayList<>(); for (int i = 0; i <= endIp; i++) { Action a = new ActionNop(); @@ -224,7 +224,7 @@ public class ActionListReader { } return reta; } - + private static int getPrevNotNullIndex(List actionMap, int startIndex) { startIndex = Math.min(startIndex, actionMap.size() - 1); for (int i = startIndex; i >= 0; i--) { @@ -234,7 +234,7 @@ public class ActionListReader { } return -1; } - + private static int getNextNotNullIndex(List actionMap, int startIndex) { for (int i = startIndex; i < actionMap.size(); i++) { if (actionMap.get(i) != null) { @@ -243,7 +243,7 @@ public class ActionListReader { } return -1; } - + private static Map actionListToMap(List actions) { Map map = new HashMap<>(actions.size()); for (Action a : actions) { @@ -294,7 +294,7 @@ public class ActionListReader { if (a == null) { continue; } - + if (a instanceof GraphSourceItemContainer) { GraphSourceItemContainer container = (GraphSourceItemContainer) a; List sizes = container.getContainerSizes(); @@ -313,7 +313,7 @@ public class ActionListReader { } } } - + private static long updateAddresses(List actions, long address, int version) { for (int i = 0; i < actions.size(); i++) { Action a = actions.get(i); @@ -327,7 +327,7 @@ public class ActionListReader { } return address; } - + private static void updateActionLengths(List actions, int version) { for (int i = 0; i < actions.size(); i++) { Action a = actions.get(i); @@ -335,7 +335,7 @@ public class ActionListReader { a.actionLength = length - 1 - ((a.actionCode >= 0x80) ? 2 : 0); } } - + private static void updateActionStores(List actions, Map jumps) { Map actionMap = actionListToMap(actions); for (int i = 0; i < actions.size(); i++) { @@ -358,7 +358,7 @@ public class ActionListReader { } } } - + private static void updateContainerSizes(List actions, Map> containerLastActions) { for (int i = 0; i < actions.size(); i++) { Action a = actions.get(i); @@ -383,7 +383,7 @@ public class ActionListReader { } } } - + private static void replaceContainerLastActions(Map> containerLastActions, Action oldTarget, Action newTarget) { for (Action a : containerLastActions.keySet()) { List targets = containerLastActions.get(a); @@ -394,7 +394,7 @@ public class ActionListReader { } } } - + private static void updateJumps(List actions, Map jumps, Map> containerLastActions, long endAddress, int version) { if (actions.isEmpty()) { return; @@ -432,21 +432,21 @@ public class ActionListReader { aJump.setJumpOffset((int) offset); } } - } + } @SuppressWarnings("unchecked") - private static Action readActionListAtPos(List listeners, long containerSWFOffset, ConstantPool cpool, - SWFInputStream sis, ReReadableInputStream rri, - List actions, List nextOffsets, - long ip, long startIp, long endIp, int version, String path, boolean indeterminate, List visitedContainers) throws IOException { - + private static Action readActionListAtPos(List listeners, long containerSWFOffset, ConstantPool cpool, + SWFInputStream sis, ReReadableInputStream rri, + List actions, List nextOffsets, + long ip, long startIp, long endIp, int version, String path, boolean indeterminate, List visitedContainers) throws IOException { + Action entryAction = null; if (visitedContainers.contains(ip)) { return null; } visitedContainers.add(ip); - + Queue jumpQueue = new LinkedList<>(); jumpQueue.add(ip); while (!jumpQueue.isEmpty()) { @@ -458,7 +458,7 @@ public class ActionListReader { if ((a = sis.readAction(rri, cpool)) == null) { break; } - + int actionLengthWithHeader = getTotalActionLength(a); // unknown action, replace with jump @@ -470,25 +470,25 @@ public class ActionListReader { a = aJump; actionLengthWithHeader = getTotalActionLength(a); } - + if (entryAction == null) { entryAction = a; } ensureCapacity(actions, nextOffsets, ip); - + Action existingAction = actions.get((int) ip); if (existingAction != null) { break; } - + actions.set((int) ip, a); nextOffsets.set((int) ip, ip + actionLengthWithHeader); - + for (int i = 0; i < listeners.size(); i++) { listeners.get(i).progress("Reading", rri.getCount(), rri.length()); } - + a.containerSWFOffset = containerSWFOffset; a.setAddress(ip, version, false); @@ -501,7 +501,7 @@ public class ActionListReader { cpool.setNew(((ActionConstantPool) a).constantPool); } else if (a instanceof ActionIf) { ActionIf aIf = (ActionIf) a; - long nIp = ip + actionLengthWithHeader + aIf.getJumpOffset(); + long nIp = ip + actionLengthWithHeader + aIf.getJumpOffset(); if (nIp >= 0) { jumpQueue.add(nIp); } @@ -520,17 +520,17 @@ public class ActionListReader { if (size != 0) { long ip2 = ip + actionLengthWithHeader; //long endIp2 = ip + actionLengthWithHeader + size; - readActionListAtPos(listeners, containerSWFOffset, cpool, - sis, rri, + readActionListAtPos(listeners, containerSWFOffset, cpool, + sis, rri, actions, nextOffsets, ip2, startIp, endIp, version, newPath, indeterminate, visitedContainers); actionLengthWithHeader += size; } } } - + ip = ip + actionLengthWithHeader; - + if (a.isExit()) { break; } @@ -542,7 +542,7 @@ public class ActionListReader { private static int getTotalActionLength(Action action) { return action.actionLength + 1 + ((action.actionCode >= 0x80) ? 2 : 0); } - + private static void ensureCapacity(List actions, List nextOffsets, long index) { while (actions.size() <= index) { actions.add(null); @@ -635,14 +635,14 @@ public class ActionListReader { if (deobfuscate) { top = stack.pop(); } - int nip = (int)rri.getPos() + aif.getJumpOffset(); + int nip = (int) rri.getPos() + aif.getJumpOffset(); if (decideBranch) { System.out.print("newip " + nip + ", "); System.out.print("Action: jump(j),ignore(i),compute(c)?"); String next = sc.next(); if (next.equals("j")) { - newip = (int)rri.getPos() + aif.getJumpOffset(); + newip = (int) rri.getPos() + aif.getJumpOffset(); rri.setPos(newip); } else if (next.equals("i")) { @@ -655,7 +655,7 @@ public class ActionListReader { System.err.print("is compiletime -> "); } if (EcmaScript.toBoolean(top.getResult())) { - newip = (int)rri.getPos() + aif.getJumpOffset(); + newip = (int) rri.getPos() + aif.getJumpOffset(); aif.jumpUsed = true; if (aif.ignoreUsed) { aif.compileTime = false; @@ -679,7 +679,7 @@ public class ActionListReader { goaif = true; } } else if (a instanceof ActionJump) { - newip = (int)rri.getPos() + ((ActionJump) a).getJumpOffset(); + newip = (int) rri.getPos() + ((ActionJump) a).getJumpOffset(); } else if (!(a instanceof GraphSourceItemContainer)) { if (deobfuscate) { //return in for..in, TODO:Handle this better way @@ -793,8 +793,8 @@ public class ActionListReader { if ((!stateChanged) && curVisited > 1) { List branches = new ArrayList<>(); - branches.add((int)rri.getPos() + aif.getJumpOffset()); - branches.add((int)rri.getPos()); + branches.add((int) rri.getPos() + aif.getJumpOffset()); + branches.add((int) rri.getPos()); for (int br : branches) { int visc = 0; if (visited.containsKey(br)) { @@ -811,10 +811,10 @@ public class ActionListReader { break loopip; } - int oldPos = (int)rri.getPos(); + int oldPos = (int) rri.getPos(); @SuppressWarnings("unchecked") Stack substack = (Stack) stack.clone(); - deobfustaceActionListAtPosRecursive(listeners, output, containers, containerSWFOffset, prepareLocalBranch(localData), substack, cpool, sis, rri, (int)rri.getPos() + aif.getJumpOffset(), ret, startIp, endip, path, visited, indeterminate, decisionStates, version); + deobfustaceActionListAtPosRecursive(listeners, output, containers, containerSWFOffset, prepareLocalBranch(localData), substack, cpool, sis, rri, (int) rri.getPos() + aif.getJumpOffset(), ret, startIp, endip, path, visited, indeterminate, decisionStates, version); rri.setPos(oldPos); } prevIp = ip; @@ -826,7 +826,7 @@ public class ActionListReader { listener.progress("Deobfuscating", rri.getCount(), rri.length()); } } - + private static List prepareLocalBranch(List localData) { @SuppressWarnings("unchecked") HashMap regNames = (HashMap) localData.get(0); diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java b/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java index 2a8aba4d9..2e13918d0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java @@ -49,38 +49,38 @@ public class ActionWaitForFrame extends Action implements ActionStore { skipCount = sis.readUI8(); skipped = new ArrayList<>(); /*for (int i = 0; i < skipCount; i++) { - Action a = sis.readAction(cpool); - if (a instanceof ActionEnd) { - skipCount = i; - break; - } - if (a == null) { - skipCount = i; - break; - } - if (a instanceof ActionPush) { - if (cpool != null) { - ((ActionPush) a).constantPool = cpool.constants; - } - } - skipped.add(a); - } - boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); - if (deobfuscate) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - for (int i = 0; i < skipCount; i++) { - baos.write(skipped.get(i).getBytes(sis.getVersion())); - } - baos.write(new ActionEnd().getBytes(sis.getVersion())); - SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); - skipped = sis2.readActionList(new ArrayList(), 0, ""); - if (!skipped.isEmpty()) { - if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { - skipped.remove(skipped.size() - 1); - } - } - skipCount = skipped.size(); - }*/ + Action a = sis.readAction(cpool); + if (a instanceof ActionEnd) { + skipCount = i; + break; + } + if (a == null) { + skipCount = i; + break; + } + if (a instanceof ActionPush) { + if (cpool != null) { + ((ActionPush) a).constantPool = cpool.constants; + } + } + skipped.add(a); + } + boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); + if (deobfuscate) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int i = 0; i < skipCount; i++) { + baos.write(skipped.get(i).getBytes(sis.getVersion())); + } + baos.write(new ActionEnd().getBytes(sis.getVersion())); + SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); + skipped = sis2.readActionList(new ArrayList(), 0, ""); + if (!skipped.isEmpty()) { + if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { + skipped.remove(skipped.size() - 1); + } + } + skipCount = skipped.size(); + }*/ } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java index bbc33c928..649b0b9a6 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java @@ -63,33 +63,33 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { skipCount = sis.readUI8(); skipped = new ArrayList<>(); /*for (int i = 0; i < skipCount; i++) { - Action a = sis.readAction(cpool); - if (a instanceof ActionEnd) { - skipCount = i; - break; - } - if (a == null) { - skipCount = i; - break; - } - skipped.add(a); - } - boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); - if (deobfuscate) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - for (int i = 0; i < skipCount; i++) { - baos.write(skipped.get(i).getBytes(sis.getVersion())); - } - baos.write(new ActionEnd().getBytes(sis.getVersion())); - SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); - skipped = sis2.readActionList(new ArrayList(), 0, ""); - if (!skipped.isEmpty()) { - if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { - skipped.remove(skipped.size() - 1); - } - } - skipCount = skipped.size(); - }*/ + Action a = sis.readAction(cpool); + if (a instanceof ActionEnd) { + skipCount = i; + break; + } + if (a == null) { + skipCount = i; + break; + } + skipped.add(a); + } + boolean deobfuscate = Configuration.getConfig("autoDeobfuscate", true); + if (deobfuscate) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + for (int i = 0; i < skipCount; i++) { + baos.write(skipped.get(i).getBytes(sis.getVersion())); + } + baos.write(new ActionEnd().getBytes(sis.getVersion())); + SWFInputStream sis2 = new SWFInputStream(new ByteArrayInputStream(baos.toByteArray()), sis.getVersion()); + skipped = sis2.readActionList(new ArrayList(), 0, ""); + if (!skipped.isEmpty()) { + if (skipped.get(skipped.size() - 1) instanceof ActionEnd) { + skipped.remove(skipped.size() - 1); + } + } + skipCount = skipped.size(); + }*/ } public ActionWaitForFrame2(FlasmLexer lexer) throws IOException, ParseException { diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index aabb12f93..d7a5e26db 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -69,7 +69,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta long endPos = sis.getPos(); //code = new ArrayList(); hdrSize = endPos - startPos; - int posBef2 = (int)rri.getPos(); + int posBef2 = (int) rri.getPos(); //code = sis.readActionList(rri.getPos(), getFileAddress() + hdrSize, rri, codeSize); //rri.setPos(posBef2 + codeSize); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java index e0552f323..656ede840 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf5/ActionWith.java @@ -110,8 +110,7 @@ public class ActionWith extends Action implements GraphSourceItemContainer { public void setContainerSize(int index, long size) { if (index == 0) { codeSize = (int) size; - } - else { + } else { throw new IllegalArgumentException("Index must be 0."); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 6337f4daa..720491cfe 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -101,7 +101,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont long posAfter = sis.getPos(); hdrSize = posAfter - posBef; //code = new ArrayList(); - int posBef2 = (int)rri.getPos(); + int posBef2 = (int) rri.getPos(); //code = sis.readActionList(rri.getPos(), getFileAddress() + hdrSize, rri, codeSize); //rri.setPos(posBef2 + codeSize); } diff --git a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java index 5d991ed70..b35669f76 100644 --- a/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java +++ b/trunk/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java @@ -208,7 +208,7 @@ public class ActionTry extends Action implements GraphSourceItemContainer { public long getTrySize() { return trySize; } - + @Override public List getContainerSizes() { List ret = new ArrayList<>(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index 59fdf9027..abb19226a 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -105,7 +105,7 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { } public void setDrawable(final DrawableTag drawable, final SWF swf, final HashMap characters, int frameRate) { - pause(); + pause(); this.drawable = drawable; this.swf = swf; this.characters = characters; @@ -139,11 +139,11 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { if (drawable == null) { return 0; } - int ret=(int)Math.ceil(percent * drawable.getNumFrames() / 100.0); - if(ret==0){ + int ret = (int) Math.ceil(percent * drawable.getNumFrames() / 100.0); + if (ret == 0) { ret = 1; } - return ret; + return ret; } @Override @@ -163,7 +163,7 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { } private void drawFrame() { - if(drawable == null){ + if (drawable == null) { return; } int nframe = percent * drawable.getNumFrames() / 100; @@ -210,9 +210,9 @@ public class ImagePanel extends JPanel implements ActionListener, FlashDisplay { @Override public void gotoFrame(int frame) { - if(drawable==null){ + if (drawable == null) { percent = 0; - }else{ + } else { percent = frame * 100 / drawable.getNumFrames(); } drawFrame(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java index 2abe879f7..5118616ed 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java @@ -31,7 +31,6 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -41,14 +40,12 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; -import static javax.swing.JFrame.EXIT_ON_CLOSE; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextField; -import javax.swing.SwingConstants; import javax.swing.SwingWorker; import javax.swing.filechooser.FileFilter; @@ -178,8 +175,8 @@ public class LoadFromCacheFrame extends AppFrame implements ActionListener { } } filter(); - - + + return null; } @@ -190,7 +187,6 @@ public class LoadFromCacheFrame extends AppFrame implements ActionListener { refreshButton.setEnabled(true); progressBar.setVisible(false); } - }.execute(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java index 8baf4a12b..8d4329eb8 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java @@ -2,7 +2,6 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.Configuration; import com.jpexs.decompiler.flash.SWF; -import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.helpers.Helper; import com.jpexs.helpers.LimitedInputStream; import com.jpexs.helpers.PosMarkedInputStream; @@ -24,7 +23,6 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.BufferedInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -101,17 +99,17 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { setProgress(pos * 100 / ret.size()); pos++; try { - PosMarkedInputStream pmi=new PosMarkedInputStream(ret.get(addr)); + PosMarkedInputStream pmi = new PosMarkedInputStream(ret.get(addr)); ReReadableInputStream is = new ReReadableInputStream(pmi); SWF swf = new SWF(is, null, false, true); long limit = pmi.getPos(); - is.setPos(0); + is.setPos(0); is = new ReReadableInputStream(new LimitedInputStream(is, limit)); if (swf.fileSize > 0 && swf.version > 0 && !swf.tags.isEmpty() && swf.version < 25/*Needs to be fixed when SWF versions reaches this value*/) { - String p=translate("swfitem").replace("%version%", "" + swf.version).replace("%size%", "" + swf.fileSize); + String p = translate("swfitem").replace("%version%", "" + swf.version).replace("%size%", "" + swf.fileSize); publish(p); swfStreams.add(is); - } + } } catch (OutOfMemoryError ome) { System.gc(); @@ -292,11 +290,11 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { JButton openButton = new JButton(translate("button.open")); openButton.setActionCommand("OPENSWF"); openButton.addActionListener(this); - + JButton saveButton = new JButton(translate("button.save")); saveButton.setActionCommand("SAVE"); saveButton.addActionListener(this); - + rightButtonsPanel.add(openButton); rightButtonsPanel.add(saveButton); rightPanel.add(rightButtonsPanel, BorderLayout.SOUTH); @@ -335,7 +333,7 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { return; } int[] selected = listRes.getSelectedIndices(); - if (selected.length>0) { + if (selected.length > 0) { JFileChooser fc = new JFileChooser(); fc.setCurrentDirectory(new File(Configuration.getConfig("lastSaveDir", "."))); if (selected.length > 1) { @@ -362,14 +360,14 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { File file = Helper.fixDialogFile(fc.getSelectedFile()); try { if (selected.length == 1) { - ReReadableInputStream bis=foundIs.get(selected[0]); + ReReadableInputStream bis = foundIs.get(selected[0]); bis.setPos(0); Helper.saveStream(bis, file); } else { for (int sel : selected) { - ReReadableInputStream bis=foundIs.get(sel); + ReReadableInputStream bis = foundIs.get(sel); bis.setPos(0); - Helper.saveStream(bis, new File(file, "movie"+sel+".swf")); + Helper.saveStream(bis, new File(file, "movie" + sel + ".swf")); } } Configuration.setConfig("lastSaveDir", file.getParentFile().getAbsolutePath()); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java index 1f36a28f4..6c4ceee84 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/Main.java @@ -325,7 +325,7 @@ public class Main { } else { if (inputStream instanceof FileInputStream) { openFile(file); - } else if(inputStream instanceof ReReadableInputStream){ + } else if (inputStream instanceof ReReadableInputStream) { try { ((ReReadableInputStream) inputStream).setPos(0); } catch (IOException ex) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java index 0581e8534..0b25c4671 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java @@ -2794,9 +2794,9 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel } else { int bi = abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getBodyIndex(); if (bi != -1) { - abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants); + abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants, abcPanel.decompiledTextArea.getCurrentTrait(), abcPanel.abc.method_info[abcPanel.abc.bodies[bi].method_info]); } - abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc, abcPanel.decompiledTextArea.getCurrentTrait()); } Main.stopWork(); View.showMessageDialog(null, "Control flow restored"); @@ -2862,17 +2862,18 @@ public class MainFrame extends AppRibbonFrame implements ActionListener, TreeSel } } else { int bi = abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getBodyIndex(); + Trait t = abcPanel.decompiledTextArea.getCurrentTrait(); if (bi != -1) { if (deobfuscationDialog.codeProcessingLevel.getValue() == DeobfuscationDialog.LEVEL_REMOVE_DEAD_CODE) { - abcPanel.abc.bodies[bi].removeDeadCode(abcPanel.abc.constants); + abcPanel.abc.bodies[bi].removeDeadCode(abcPanel.abc.constants, t, abcPanel.abc.method_info[abcPanel.abc.bodies[bi].method_info]); } else if (deobfuscationDialog.codeProcessingLevel.getValue() == DeobfuscationDialog.LEVEL_REMOVE_TRAPS) { - abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); + abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, t, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); } else if (deobfuscationDialog.codeProcessingLevel.getValue() == DeobfuscationDialog.LEVEL_RESTORE_CONTROL_FLOW) { - abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); - abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants); + abcPanel.abc.bodies[bi].removeTraps(abcPanel.abc.constants, abcPanel.abc, t, abcPanel.decompiledTextArea.getScriptLeaf().scriptIndex, abcPanel.decompiledTextArea.getClassIndex(), abcPanel.decompiledTextArea.getIsStatic(), ""/*FIXME*/); + abcPanel.abc.bodies[bi].restoreControlFlow(abcPanel.abc.constants, t, abcPanel.abc.method_info[abcPanel.abc.bodies[bi].method_info]); } } - abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abcPanel.abc, t); } } catch (Exception ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, "Deobfuscation error", ex); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java index 1185d3de2..ac4d764b3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/SWFPreviwPanel.java @@ -66,7 +66,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public void run() { buffering.setVisible(true); - SWF.framesToImage(0, frameImages, 0, swf.frameCount-1, swf.tags, swf.tags, swf.displayRect, swf.frameCount, new Stack()); + SWF.framesToImage(0, frameImages, 0, swf.frameCount - 1, swf.tags, swf.tags, swf.displayRect, swf.frameCount, new Stack()); buffering.setVisible(false); } }.start(); @@ -104,8 +104,8 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { } }, 0, 1000 / swf.frameRate); } - - private void drawFrame(){ + + private void drawFrame() { pan.setImage(frameImages.get(frame - 1)); } @@ -116,7 +116,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public int getTotalFrames() { - if(swf==null){ + if (swf == null) { return 0; } return swf.frameCount; @@ -124,10 +124,10 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public void pause() { - if(timer!=null){ + if (timer != null) { timer.cancel(); timer = null; - } + } } @Override @@ -138,7 +138,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public boolean isPlaying() { - return timer!=null; + return timer != null; } @Override @@ -149,7 +149,7 @@ public class SWFPreviwPanel extends JPanel implements FlashDisplay { @Override public int getFrameRate() { - if(swf==null){ + if (swf == null) { return 1; } return swf.frameRate; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 1139352fb..f6abe42a5 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -462,7 +462,7 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Fr switchAbc(listIndex); decompiledTextArea.clearScriptCache(); decompiledTextArea.reloadClass(); - detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(-1, abc); + detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(-1, abc, decompiledTextArea.getCurrentTrait()); } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java index a2aee303a..305694be1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java @@ -21,7 +21,9 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.graph.AVM2Graph; import com.jpexs.decompiler.flash.abc.avm2.parser.ASM3Parser; +import com.jpexs.decompiler.flash.abc.avm2.parser.MissingSymbolHandler; import com.jpexs.decompiler.flash.abc.avm2.parser.ParseException; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.gui.GraphFrame; import com.jpexs.decompiler.flash.gui.View; import com.jpexs.decompiler.flash.helpers.Highlighting; @@ -47,6 +49,7 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi private String textWithHex = ""; private String textNoHex = ""; private boolean hex = false; + private Trait trait; public boolean isHex() { return hex; @@ -102,14 +105,15 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi return super.getName(); } - public void setBodyIndex(int bodyIndex, ABC abc, String name) { + public void setBodyIndex(int bodyIndex, ABC abc, String name, Trait trait) { this.bodyIndex = bodyIndex; this.abc = abc; this.name = name; + this.trait = trait; if (bodyIndex == -1) { return; } - String textWithHexTags = abc.bodies[bodyIndex].code.toASMSource(abc.constants, abc.bodies[bodyIndex], true, true); + String textWithHexTags = abc.bodies[bodyIndex].code.toASMSource(abc.constants, trait, abc.method_info[abc.bodies[bodyIndex].method_info], abc.bodies[bodyIndex], true, true); textWithHex = Helper.hexToComments(textWithHexTags); textNoHex = Helper.stripComments(textWithHexTags); setText(hex ? textWithHex : textNoHex); @@ -130,7 +134,28 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi public boolean save(ConstantPool constants) { try { - AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(getText().getBytes("UTF-8")), constants, new DialogMissingSymbolHandler(), abc.bodies[bodyIndex]); + AVM2Code acode = ASM3Parser.parse(new ByteArrayInputStream(getText().getBytes("UTF-8")), constants, trait, new MissingSymbolHandler() { + //no longer ask for adding new constants + @Override + public boolean missingString(String value) { + return true; + } + + @Override + public boolean missingInt(long value) { + return true; + } + + @Override + public boolean missingUInt(long value) { + return true; + } + + @Override + public boolean missingDouble(double value) { + return true; + } + }, abc.bodies[bodyIndex], abc.method_info[abc.bodies[bodyIndex].method_info]); acode.getBytes(abc.bodies[bodyIndex].codeBytes); abc.bodies[bodyIndex].code = acode; } catch (IOException ex) { @@ -147,6 +172,7 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi disassembledHilights = Highlighting.getInstrHighlights(t); t = Highlighting.stripHilights(t); super.setText(t); + setCaretPosition(0); } public void selectInstruction(int pos) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 0f3c5f236..453266b31 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -23,6 +23,8 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitFunction; +import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.View; @@ -53,6 +55,11 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL private int classIndex = -1; private boolean isStatic = false; private Cache cache = Cache.getInstance(true); + private Trait currentTrait = null; + + public Trait getCurrentTrait() { + return currentTrait; + } public ScriptPack getScriptLeaf() { return script; @@ -103,11 +110,22 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL public void run() { } }); + //fix for inner functions: + if (trait instanceof TraitMethodGetterSetter) { + TraitMethodGetterSetter tm = (TraitMethodGetterSetter) trait; + if (tm.method_info != methodIndex) { + trait = null; + } + } + if (trait instanceof TraitFunction) { + TraitFunction tf = (TraitFunction) trait; + if (tf.method_info != methodIndex) { + trait = null; + } + } abcPanel.detailPanel.showCard(DetailPanel.METHOD_TRAIT_CARD, trait); if (reset || (abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getBodyIndex() != bi)) { - abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abc, name); - abcPanel.detailPanel.methodTraitPanel.methodBodyParamsPanel.loadFromBody(abc.bodies[bi]); - abcPanel.detailPanel.methodTraitPanel.methodInfoPanel.load(abc.bodies[bi].method_info, abc); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abc, name, trait); abcPanel.detailPanel.setEditMode(false); this.isStatic = isStatic; } @@ -205,21 +223,21 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL name = abc.instance_info[classIndex].getName(abc.constants).getNameWithNamespace(abc.constants); } } - Trait t = null; + currentTrait = null; for (Highlighting th : traitHighlights) { if ((pos >= th.startPos) && (pos < th.startPos + th.len)) { lastTraitIndex = (int) th.offset; if ((abc != null) && (classIndex != -1)) { - t = abc.findTraitByTraitId(classIndex, lastTraitIndex); + currentTrait = abc.findTraitByTraitId(classIndex, lastTraitIndex); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); - if (t != null) { - name += ":" + t.getName(abc).getName(abc.constants, new ArrayList()); + if (currentTrait != null) { + name += ":" + currentTrait.getName(abc).getName(abc.constants, new ArrayList()); } } } } - displayMethod(pos, (int) tm.offset, name, t, isStatic); + displayMethod(pos, (int) tm.offset, name, currentTrait, isStatic); currentMethodHighlight = tm; @@ -231,32 +249,33 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL setNoTrait(); return; } + currentTrait = null; for (Highlighting th : traitHighlights) { if ((pos >= th.startPos) && (pos < th.startPos + th.len)) { lastTraitIndex = (int) th.offset; - Trait tr = abc.findTraitByTraitId(classIndex, (int) th.offset); - if (tr != null) { - if (tr instanceof TraitSlotConst) { - abcPanel.detailPanel.slotConstTraitPanel.load((TraitSlotConst) tr, abc, + currentTrait = abc.findTraitByTraitId(classIndex, (int) th.offset); + if (currentTrait != null) { + if (currentTrait instanceof TraitSlotConst) { + abcPanel.detailPanel.slotConstTraitPanel.load((TraitSlotConst) currentTrait, abc, abc.isStaticTraitId(classIndex, lastTraitIndex)); - abcPanel.detailPanel.showCard(DetailPanel.SLOT_CONST_TRAIT_CARD, tr); + abcPanel.detailPanel.showCard(DetailPanel.SLOT_CONST_TRAIT_CARD, currentTrait); abcPanel.detailPanel.setEditMode(false); return; } } currentMethodHighlight = th; String name = ""; - Trait t = null; + currentTrait = null; if (abc != null) { name = abc.instance_info[classIndex].getName(abc.constants).getNameWithNamespace(abc.constants); - t = abc.findTraitByTraitId(classIndex, lastTraitIndex); + currentTrait = abc.findTraitByTraitId(classIndex, lastTraitIndex); isStatic = abc.isStaticTraitId(classIndex, lastTraitIndex); - if (t != null) { - name += ":" + t.getName(abc).getName(abc.constants, new ArrayList()); + if (currentTrait != null) { + name += ":" + currentTrait.getName(abc).getName(abc.constants, new ArrayList()); } } - displayMethod(pos, abc.findMethodIdByTraitId(classIndex, (int) th.offset), name, t, isStatic); + displayMethod(pos, abc.findMethodIdByTraitId(classIndex, (int) th.offset), name, currentTrait, isStatic); return; } } @@ -391,7 +410,7 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL View.execInEventDispatch(new Runnable() { @Override public void run() { - if (hilightedCode.length() > 1000000) { + if (hilightedCode.length() > 1024 * 1024 * 2/*2MB*/) { setContentType("text/plain"); } else { setContentType("text/actionscript"); @@ -421,4 +440,10 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL cache.clear(); setText(""); } + + @Override + public void setText(String t) { + super.setText(t); + setCaretPosition(0); + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java index 3551ec974..bf0580db1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java @@ -20,7 +20,6 @@ import com.jpexs.decompiler.flash.abc.types.traits.Trait; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.HeaderLabel; import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.FlowLayout; @@ -54,7 +53,7 @@ public class DetailPanel extends JPanel implements ActionListener { private boolean editMode = false; private JPanel buttonsPanel; private ABCPanel abcPanel; - private JLabel traitNameLabel; + private JTextArea traitNameLabel; public DetailPanel(ABCPanel abcPanel) { this.abcPanel = abcPanel; @@ -106,7 +105,7 @@ public class DetailPanel extends JPanel implements ActionListener { selectedLabel.setHorizontalAlignment(SwingConstants.CENTER); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.add(selectedLabel, BorderLayout.NORTH); - traitNameLabel = new JLabel(""); + traitNameLabel = new JTextArea(""); JPanel traitInfoPanel = new JPanel(); traitInfoPanel.setLayout(new BoxLayout(traitInfoPanel, BoxLayout.LINE_AXIS)); traitInfoPanel.add(new JLabel(" " + translate("abc.detail.traitname"))); @@ -156,7 +155,7 @@ public class DetailPanel extends JPanel implements ActionListener { if (trait == null) { traitNameLabel.setText("-"); } else { - traitNameLabel.setText(" m[" + trait.name_index + "]\"" + Helper.escapeString(trait.getName(abcPanel.abc).toString(abcPanel.abc.constants, new ArrayList())) + "\""); + traitNameLabel.setText(" " + trait.getName(abcPanel.abc).getName(abcPanel.abc.constants, new ArrayList()) + " Index: " + trait.name_index); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodBodyParamsPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodBodyParamsPanel.java deleted file mode 100644 index ca096d6f7..000000000 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodBodyParamsPanel.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2011-2013 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.gui.abc; - -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import static com.jpexs.decompiler.flash.gui.AppStrings.translate; -import com.jpexs.decompiler.flash.gui.MyFormattedTextField; -import com.jpexs.decompiler.flash.gui.View; -import java.awt.Color; -import java.awt.Dimension; -import java.text.NumberFormat; -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -/** - * - * @author JPEXS - */ -public class MethodBodyParamsPanel extends JPanel implements ChangeListener { - - public JLabel maxStackLabel; - public JFormattedTextField maxStackField; - public JLabel localCountLabel; - public JFormattedTextField localCountField; - public JLabel initScopeDepthLabel; - public JFormattedTextField initScopeDepthField; - public JLabel maxScopeDepthLabel; - public JFormattedTextField maxScopeDepthField; - public MethodBody body; - public JCheckBox autoFillCheckBox = new JCheckBox(translate("abc.detail.body.params.autofill")); - public JLabel experimentalLabel = new JLabel(translate("abc.detail.body.params.autofill.experimental")); - private ABCPanel abcPanel; - - public MethodBodyParamsPanel(ABCPanel abcPanel) { - setLayout(null); - this.abcPanel = abcPanel; - - JComponent[][] cmps = new JComponent[][]{ - {maxStackLabel = new JLabel(translate("abc.detail.body.params.maxstack"), SwingConstants.RIGHT), maxStackField = new MyFormattedTextField(NumberFormat.getNumberInstance())}, - {localCountLabel = new JLabel(translate("abc.detail.body.params.localregcount"), SwingConstants.RIGHT), localCountField = new MyFormattedTextField(NumberFormat.getNumberInstance())}, - {initScopeDepthLabel = new JLabel(translate("abc.detail.body.params.minscope"), SwingConstants.RIGHT), initScopeDepthField = new MyFormattedTextField(NumberFormat.getNumberInstance())}, - {maxScopeDepthLabel = new JLabel(translate("abc.detail.body.params.maxscope"), SwingConstants.RIGHT), maxScopeDepthField = new MyFormattedTextField(NumberFormat.getNumberInstance())} - }; - - - int maxw = 0; - for (int i = 0; i < cmps.length; i++) { - Dimension d = cmps[i][0].getPreferredSize(); - if (d.width > maxw) { - maxw = d.width; - } - } - - int top = 0; - for (int i = 0; i < cmps.length; i++) { - - cmps[i][0].setBounds(10, top, maxw, cmps[i][1].getPreferredSize().height); - cmps[i][1].setBounds(10 + maxw + 10, top, 75, cmps[i][1].getPreferredSize().height); - add(cmps[i][0]); - add(cmps[i][1]); - top += cmps[i][1].getPreferredSize().height; - } - - add(autoFillCheckBox); - autoFillCheckBox.addChangeListener(this); - - experimentalLabel.setForeground(Color.red); - - autoFillCheckBox.setLocation(0, top); - autoFillCheckBox.setSize(autoFillCheckBox.getPreferredSize()); - experimentalLabel.setLocation(20 + autoFillCheckBox.getWidth(), top); - experimentalLabel.setSize(experimentalLabel.getPreferredSize()); - add(experimentalLabel); - - setPreferredSize(new Dimension(300, 150)); - } - - public void loadFromBody(MethodBody body) { - this.body = body; - if (body == null) { - maxStackField.setText("0"); - localCountField.setText("0"); - initScopeDepthField.setText("0"); - maxScopeDepthField.setText("0"); - return; - } - maxStackField.setText("" + body.max_stack); - localCountField.setText("" + body.max_regs); - initScopeDepthField.setText("" + body.init_scope_depth); - maxScopeDepthField.setText("" + body.max_scope_depth); - } - - public boolean save() { - if (body != null) { - body.init_scope_depth = Integer.parseInt(initScopeDepthField.getText()); - if (!autoFillCheckBox.isSelected()) { - body.max_stack = Integer.parseInt(maxStackField.getText()); - body.max_regs = Integer.parseInt(localCountField.getText()); - body.max_scope_depth = Integer.parseInt(maxScopeDepthField.getText()); - } else { - if (!body.autoFillStats(abcPanel.abc)) { - View.showMessageDialog(null, translate("message.autofill.failed"), translate("message.warning"), JOptionPane.WARNING_MESSAGE); - } - } - return true; - } - return false; - } - - @Override - public void stateChanged(ChangeEvent e) { - if (e.getSource() == autoFillCheckBox) { - if (autoFillCheckBox.isSelected()) { - localCountField.setEnabled(false); - maxScopeDepthField.setEnabled(false); - maxStackField.setEnabled(false); - } else { - localCountField.setEnabled(true); - maxScopeDepthField.setEnabled(true); - maxStackField.setEnabled(true); - } - } - } - - public void setEditMode(boolean val) { - maxStackField.setEditable(val); - localCountField.setEditable(val); - initScopeDepthField.setEditable(val); - maxScopeDepthField.setEditable(val); - autoFillCheckBox.setEnabled(val); - } -} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java index bd252b1da..de8068f9d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.gui.abc; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.View; @@ -58,12 +59,12 @@ public class MethodCodePanel extends JPanel implements ActionListener { sourceTextArea.hilighOffset(offset); } - public void setBodyIndex(int bodyIndex, ABC abc) { - sourceTextArea.setBodyIndex(bodyIndex, abc, sourceTextArea.getName()); + public void setBodyIndex(int bodyIndex, ABC abc, Trait trait) { + sourceTextArea.setBodyIndex(bodyIndex, abc, sourceTextArea.getName(), trait); } - public void setBodyIndex(int bodyIndex, ABC abc, String name) { - sourceTextArea.setBodyIndex(bodyIndex, abc, name); + public void setBodyIndex(int bodyIndex, ABC abc, String name, Trait trait) { + sourceTextArea.setBodyIndex(bodyIndex, abc, name, trait); } public int getBodyIndex() { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodInfoPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodInfoPanel.java deleted file mode 100644 index 572bba144..000000000 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodInfoPanel.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2011-2013 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.gui.abc; - -import com.jpexs.decompiler.flash.Configuration; -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.MethodInfoParser; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.ParseException; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import static com.jpexs.decompiler.flash.gui.AppStrings.translate; -import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.helpers.Helper; -import java.awt.Dimension; -import java.awt.Font; -import java.util.ArrayList; -import javax.swing.*; -import jsyntaxpane.syntaxkits.Flasm3MethodInfoSyntaxKit; - -/** - * - * @author JPEXS - */ -public class MethodInfoPanel extends JPanel { - - public LineMarkedEditorPane paramEditor; - public JEditorPane returnTypeEditor; - private MethodInfo methodInfo; - private ABC abc; - private JLabel methodIndexLabel; - - public MethodInfoPanel() { - returnTypeEditor = new UndoFixedEditorPane(); - paramEditor = new LineMarkedEditorPane(); - setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); - JPanel miPanel = new JPanel(); - miPanel.setLayout(new BoxLayout(miPanel, BoxLayout.LINE_AXIS)); - miPanel.add(new JLabel(translate("abc.detail.methodinfo.methodindex"))); - methodIndexLabel = new JLabel(" "); - miPanel.add(methodIndexLabel); - add(miPanel); - add(new JLabel(translate("abc.detail.methodinfo.parameters"))); - add(new JScrollPane(paramEditor)); - add(new JLabel(translate("abc.detail.methodinfo.returnvalue"))); - JScrollPane jsp = new JScrollPane(returnTypeEditor); - add(jsp); - paramEditor.setContentType("text/flasm3_methodinfo"); - returnTypeEditor.setContentType("text/flasm3_methodinfo"); - paramEditor.setFont(new Font("Monospaced", Font.PLAIN, paramEditor.getFont().getSize())); - returnTypeEditor.setFont(new Font("Monospaced", Font.PLAIN, returnTypeEditor.getFont().getSize())); - - jsp.setMaximumSize(new Dimension(1024, 25)); - Flasm3MethodInfoSyntaxKit sk = (Flasm3MethodInfoSyntaxKit) returnTypeEditor.getEditorKit(); - sk.deinstallComponent(returnTypeEditor, "jsyntaxpane.components.LineNumbersRuler"); - } - - public void load(int methodInfoIndex, ABC abc) { - this.abc = abc; - if (methodInfoIndex <= 0) { - paramEditor.setText(""); - } - - methodIndexLabel.setText("" + methodInfoIndex); - this.methodInfo = abc.method_info[methodInfoIndex]; - int p = 0; - String ret = ""; - int optParPos = 0; - if (methodInfo.flagHas_optional()) { - optParPos = methodInfo.param_types.length - methodInfo.optional.length; - } - for (int ptype : methodInfo.param_types) { - if (p > 0) { - ret += ",\n"; - } - if (methodInfo.flagHas_paramnames() && Configuration.PARAM_NAMES_ENABLE) { - ret = ret + abc.constants.constant_string[methodInfo.paramNames[p]]; - } else { - ret = ret + "param" + (p + 1); - } - ret += ":"; - if (ptype == 0) { - ret += "*"; - } else { - ret += "m[" + ptype + "]\"" + Helper.escapeString(abc.constants.constant_multiname[ptype].toString(abc.constants, new ArrayList())) + "\""; - } - if (methodInfo.flagHas_optional()) { - if (p >= optParPos) { - ret += "=" + methodInfo.optional[p - optParPos].toString(abc.constants); - } - } - p++; - } - if (methodInfo.flagNeed_rest()) { - if (p > 0) { - ret += ",\n"; - } - ret += "... rest"; - } - paramEditor.setText(ret); - if (methodInfo.ret_type == 0) { - returnTypeEditor.setText("*"); - } else { - returnTypeEditor.setText("m[" + methodInfo.ret_type + "]\"" + Helper.escapeString(abc.constants.constant_multiname[methodInfo.ret_type].toString(abc.constants, new ArrayList())) + "\""); - } - } - - public boolean save() { - try { - MethodInfoParser.parseParams(paramEditor.getText(), methodInfo, abc); - } catch (ParseException ex) { - View.showMessageDialog(paramEditor, ex.text, translate("error.methodinfo.params"), JOptionPane.ERROR_MESSAGE); - return false; - } - try { - MethodInfoParser.parseReturnType(returnTypeEditor.getText(), methodInfo); - } catch (ParseException ex) { - View.showMessageDialog(returnTypeEditor, ex.text, translate("error.methodinfo.returnvalue"), JOptionPane.ERROR_MESSAGE); - return false; - } - return true; - } - - public void setEditMode(boolean val) { - returnTypeEditor.setEditable(val); - paramEditor.setEditable(val); - } -} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java index 763928a18..80c47786e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodTraitDetailPanel.java @@ -16,43 +16,30 @@ */ package com.jpexs.decompiler.flash.gui.abc; -import static com.jpexs.decompiler.flash.gui.AppStrings.translate; -import javax.swing.JScrollPane; -import javax.swing.JTabbedPane; +import java.awt.BorderLayout; +import javax.swing.JPanel; /** * * @author JPEXS */ -public class MethodTraitDetailPanel extends JTabbedPane implements TraitDetail { +public class MethodTraitDetailPanel extends JPanel implements TraitDetail { public MethodCodePanel methodCodePanel; - public MethodBodyParamsPanel methodBodyParamsPanel; - public MethodInfoPanel methodInfoPanel; public ABCPanel abcPanel; public MethodTraitDetailPanel(ABCPanel abcPanel) { this.abcPanel = abcPanel; methodCodePanel = new MethodCodePanel(abcPanel.decompiledTextArea); - methodBodyParamsPanel = new MethodBodyParamsPanel(abcPanel); - methodInfoPanel = new MethodInfoPanel(); - addTab(translate("abc.detail.methodinfo"), methodInfoPanel); - addTab(translate("abc.detail.body.code"), methodCodePanel); - addTab(translate("abc.detail.body.params"), new JScrollPane(methodBodyParamsPanel)); - setSelectedIndex(1); + setLayout(new BorderLayout()); + add(methodCodePanel, BorderLayout.CENTER); } @Override public boolean save() { - if (!methodInfoPanel.save()) { - return false; - } if (!methodCodePanel.save(abcPanel.abc.constants)) { return false; } - if (!methodBodyParamsPanel.save()) { - return false; - } return true; } @@ -60,8 +47,6 @@ public class MethodTraitDetailPanel extends JTabbedPane implements TraitDetail { @Override public void setEditMode(boolean val) { methodCodePanel.setEditMode(val); - methodBodyParamsPanel.setEditMode(val); - methodInfoPanel.setEditMode(val); } private boolean active = false; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java index 082736560..9a317cb15 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/SlotConstTraitDetailPanel.java @@ -17,17 +17,19 @@ package com.jpexs.decompiler.flash.gui.abc; import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.MethodInfoParser; -import com.jpexs.decompiler.flash.abc.methodinfo_parser.ParseException; +import com.jpexs.decompiler.flash.abc.avm2.parser.ASM3Parser; +import com.jpexs.decompiler.flash.abc.avm2.parser.ParseException; import com.jpexs.decompiler.flash.abc.types.ValueKind; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import static com.jpexs.decompiler.flash.gui.AppStrings.translate; import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.helpers.Helper; import java.awt.BorderLayout; -import java.util.ArrayList; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.*; -import jsyntaxpane.syntaxkits.Flasm3MethodInfoSyntaxKit; /** * @@ -41,7 +43,7 @@ public class SlotConstTraitDetailPanel extends JPanel implements TraitDetail { private boolean showWarning = false; public SlotConstTraitDetailPanel() { - slotConstEditor = new UndoFixedEditorPane(); + slotConstEditor = new LineMarkedEditorPane(); setLayout(new BorderLayout()); add(new JLabel(translate("abc.detail.slotconst.typevalue")), BorderLayout.NORTH); add(new JScrollPane(slotConstEditor), BorderLayout.CENTER); @@ -55,27 +57,30 @@ public class SlotConstTraitDetailPanel extends JPanel implements TraitDetail { //warnLabel.setLineWrap(true); warnLabel.setFont(new JLabel().getFont().deriveFont(Font.BOLD)); add(warnLabel, BorderLayout.SOUTH);*/ - slotConstEditor.setContentType("text/flasm3_methodinfo"); - Flasm3MethodInfoSyntaxKit sk = (Flasm3MethodInfoSyntaxKit) slotConstEditor.getEditorKit(); - sk.deinstallComponent(slotConstEditor, "jsyntaxpane.components.LineNumbersRuler"); + slotConstEditor.setContentType("text/flasm3"); + //Flasm3SyntaxKit sk = (Flasm3SyntaxKit) slotConstEditor.getEditorKit(); + //sk.deinstallComponent(slotConstEditor, "jsyntaxpane.components.LineNumbersRuler"); } public void load(TraitSlotConst trait, ABC abc, boolean isStatic) { this.abc = abc; this.trait = trait; - String s; - String typeStr; - if (trait.type_index > 0) { - typeStr = "m[" + trait.type_index + "]\"" + Helper.escapeString(abc.constants.constant_multiname[trait.type_index].toString(abc.constants, new ArrayList())) + "\""; - } else { - typeStr = "*"; - } - String valueStr = ""; - if (trait.value_kind != 0) { - valueStr = " = " + (new ValueKind(trait.value_index, trait.value_kind)).toString(abc.constants); - } + /*String s; + String typeStr; + if (trait.type_index > 0) { + typeStr = "m[" + trait.type_index + "]\"" + Helper.escapeString(abc.constants.constant_multiname[trait.type_index].toString(abc.constants, new ArrayList())) + "\""; + } else { + typeStr = "*"; + } + String valueStr = ""; + if (trait.value_kind != 0) { + valueStr = " = " + (new ValueKind(trait.value_index, trait.value_kind)).toString(abc.constants); + } - s = typeStr + valueStr; + s = typeStr + valueStr; + + * */ + String s = "trait " + abc.constants.multinameToString(trait.name_index) + " " + (trait.isConst() ? "const" : "slot") + " slotid " + trait.slot_id + " type " + abc.constants.multinameToString(trait.type_index) + " value " + (new ValueKind(trait.value_index, trait.value_kind).toASMString(abc.constants)); showWarning = trait.isConst() || isStatic; //warnLabel.setVisible(trait.isConst() || isStatic); @@ -84,13 +89,19 @@ public class SlotConstTraitDetailPanel extends JPanel implements TraitDetail { @Override public boolean save() { - try { - if (!MethodInfoParser.parseSlotConst(slotConstEditor.getText(), trait, abc)) { + try {//(slotConstEditor.getText(), trait, abc) + if (!ASM3Parser.parseSlotConst(new ByteArrayInputStream(slotConstEditor.getText().getBytes("UTF-8")), abc.constants, trait)) { return false; } } catch (ParseException ex) { View.showMessageDialog(slotConstEditor, ex.text, translate("error.slotconst.typevalue"), JOptionPane.ERROR_MESSAGE); return false; + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(SlotConstTraitDetailPanel.class.getName()).log(Level.SEVERE, null, ex); + return false; + } catch (IOException ex) { + Logger.getLogger(SlotConstTraitDetailPanel.class.getName()).log(Level.SEVERE, null, ex); + return false; } return true; } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index 1c096396c..a8af56045 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -565,7 +565,7 @@ public class ActionPanel extends JPanel implements ActionListener { public void setEditMode(boolean val) { // todo: create UI for editing raw data final boolean rawEdit = false; - + if (val) { setText(rawEdit ? srcHexOnly : srcNoHex); editor.setEditable(true); @@ -667,8 +667,7 @@ public class ActionPanel extends JPanel implements ActionListener { String text = editor.getText(); if (text.trim().startsWith("#hexdata")) { src.setActionBytes(getBytesFromHexaText(text)); - } - else { + } else { src.setActions(ASMParser.parse(0, src.getPos(), true, text, SWF.DEFAULT_VERSION, false), SWF.DEFAULT_VERSION); } setSource(this.src, false); @@ -714,7 +713,7 @@ public class ActionPanel extends JPanel implements ActionListener { line = line.replace(" ", ""); for (int i = 0; i < line.length() / 2; i++) { String hexStr = line.substring(i * 2, (i + 1) * 2); - byte b = (byte)Integer.parseInt(hexStr, 16); + byte b = (byte) Integer.parseInt(hexStr, 16); baos.write(b); } } @@ -728,15 +727,15 @@ public class ActionPanel extends JPanel implements ActionListener { result.append("#hexdata").append(nl); /* // hex data from decompiled actions - Scanner scanner = new Scanner(srcWithHex); - while (scanner.hasNextLine()) { - String line = scanner.nextLine().trim(); - if (line.startsWith(";")) { - result.append(line.substring(1).trim()).append(nl); - } else { - result.append(";").append(line).append(nl); - } - }*/ + Scanner scanner = new Scanner(srcWithHex); + while (scanner.hasNextLine()) { + String line = scanner.nextLine().trim(); + if (line.startsWith(";")) { + result.append(line.substring(1).trim()).append(nl); + } else { + result.append(";").append(line).append(nl); + } + }*/ byte[] data = src.getActionBytes(); for (int i = 0; i < data.length; i++) { @@ -745,10 +744,10 @@ public class ActionPanel extends JPanel implements ActionListener { } result.append(String.format("%02x ", data[i])); } - + return result.toString(); } - + public void updateSearchPos() { searchPos.setText((foundPos + 1) + "/" + found.size()); setSource(found.get(foundPos), true); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index b37bbf2a1..4beb23f05 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/trunk/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -91,7 +91,7 @@ message.confirm = Potvrzen\u00ed message.confirm.autodeobfuscate = Automatick\u00e1 deobfuskace je zp\u016fsob jak dekompilovat obfuskovan\u00fd k\u00f3d.\r\nDeobfuskace vede k pomalej\u0161\u00ed dekompilaci a n\u011bkter\u00fd nepou\u017eit\u00fd k\u00f3d m\u016f\u017ee b\u00fdt odstran\u011bn.\r\nPokud k\u00f3d nen\u00ed obfuskovan\u00fd, je lep\u0161\u00ed autodeobfuskaci vypnout. message.parallel = parallelismus -message.trait.saved = Vlastnost \u00fasp\u011b\u0161ne ulo\u017eena +message.trait.saved = Vlastnost \u00fasp\u011b\u0161n\u011b ulo\u017eena message.constant.new.string = \u0158et\u011bzec "%value%" neexistuje v tabulce konstant. Chcete ho p\u0159idat? diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java index 49ac0c868..7d3673d58 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java @@ -53,31 +53,31 @@ public class FlashPlayerPanel extends Panel implements FlashDisplay { private int frameRate; public boolean functionPlayback = false; - public synchronized String call(String callString){ + public synchronized String call(String callString) { if (pipe != null) { IntByReference ibr = new IntByReference(); Kernel32.INSTANCE.WriteFile(pipe, new byte[]{CMD_CALL}, 1, ibr, null); - int callLen=callString.getBytes().length; - Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte)((callLen>>8) &0xff),(byte)(callLen & 0xff)}, 2, ibr, null); + int callLen = callString.getBytes().length; + Kernel32.INSTANCE.WriteFile(pipe, new byte[]{(byte) ((callLen >> 8) & 0xff), (byte) (callLen & 0xff)}, 2, ibr, null); Kernel32.INSTANCE.WriteFile(pipe, callString.getBytes(), callLen, ibr, null); - + byte res[] = new byte[2]; if (Kernel32.INSTANCE.ReadFile(pipe, res, 2, ibr, null)) { int retLen = ((res[0] & 0xff) << 8) + (res[1] & 0xff); res = new byte[retLen]; if (Kernel32.INSTANCE.ReadFile(pipe, res, retLen, ibr, null)) { - String ret=new String(res,0,retLen); + String ret = new String(res, 0, retLen); return ret; - }else{ + } else { return null; } } else { return null; - } + } } return null; } - + private synchronized void resize() { if (pipe != null) { IntByReference ibr = new IntByReference(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java index caac1b1ea..7e9e362ca 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java @@ -49,7 +49,7 @@ public class PlayerControls extends JPanel implements ActionListener { private JLabel timeLabel; private JLabel totalTimeLabel; private static final Icon pauseIcon = View.getIcon("pause16"); - private static final Icon playIcon = View.getIcon("play16"); + private static final Icon playIcon = View.getIcon("play16"); public PlayerControls(final FlashDisplay display) { this.display = display; @@ -81,7 +81,7 @@ public class PlayerControls extends JPanel implements ActionListener { progress.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { - int frame = 1+(int)Math.floor(e.getX() * display.getTotalFrames() / (double)progress.getWidth()); + int frame = 1 + (int) Math.floor(e.getX() * display.getTotalFrames() / (double) progress.getWidth()); boolean p = paused; display.gotoFrame(frame); if (!p) { diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java index d3d16b0ae..5c2af0c99 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLossless2Tag.java @@ -25,7 +25,6 @@ import com.jpexs.decompiler.flash.types.ALPHABITMAPDATA; import com.jpexs.decompiler.flash.types.ALPHACOLORMAPDATA; import com.jpexs.decompiler.flash.types.ARGB; import java.awt.Color; -import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -186,7 +185,7 @@ public class DefineBitsLossless2Tag extends ImageTag implements AloneTag { } if ((bitmapFormat == DefineBitsLossless2Tag.FORMAT_32BIT_ARGB)) { c = (multiplyAlpha(bitmapData.bitmapPixelData[pos].toColor())); - } + } bi.setRGB(x, y, c.getRGB()); pos32aligned++; pos++; diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java index 9ccf26abd..837548d06 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineBitsLosslessTag.java @@ -26,7 +26,6 @@ import com.jpexs.decompiler.flash.types.COLORMAPDATA; import com.jpexs.decompiler.flash.types.PIX24; import com.jpexs.decompiler.flash.types.RGB; import java.awt.Color; -import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java b/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java index 609fe7ccd..038dfece1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java @@ -22,5 +22,4 @@ package com.jpexs.decompiler.flash.tags.base; * @author JPEXS */ public interface ContainerItem { - } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java b/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java index 2a1fa90be..f5c1761f6 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/MORPHGRADIENT.java @@ -29,7 +29,7 @@ public class MORPHGRADIENT { /** * Interpolation mode. See GRADIENT.INTERPOLATION_* constants */ - public int interPolationMode; + public int interPolationMode; public int numGradients; public MORPHGRADRECORD[] gradientRecords; diff --git a/trunk/src/com/jpexs/decompiler/graph/Graph.java b/trunk/src/com/jpexs/decompiler/graph/Graph.java index d77fcad41..bc6955c3f 100644 --- a/trunk/src/com/jpexs/decompiler/graph/Graph.java +++ b/trunk/src/com/jpexs/decompiler/graph/Graph.java @@ -2228,7 +2228,7 @@ public class Graph { continue; } strippedP = Highlighting.stripHilights(parts[p]).trim(); - + if (replaceIndents) { if (strippedP.equals(INDENTOPEN)) { level++; diff --git a/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java b/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java index 410f30284..1f7e58877 100644 --- a/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java +++ b/trunk/src/com/jpexs/decompiler/graph/model/BlockItem.java @@ -37,9 +37,9 @@ public class BlockItem extends GraphTargetItem { @Override public String toString(boolean highlight, List localData) { - return hilight("{", highlight) + "\r\n" + Graph.INDENTOPEN + "\r\n" + - Graph.graphToString(commands, highlight, false, localData) + "\r\n" + - Graph.INDENTCLOSE + "\r\n" + hilight("}", highlight); + return hilight("{", highlight) + "\r\n" + Graph.INDENTOPEN + "\r\n" + + Graph.graphToString(commands, highlight, false, localData) + "\r\n" + + Graph.INDENTCLOSE + "\r\n" + hilight("}", highlight); } @Override diff --git a/trunk/src/com/jpexs/helpers/Helper.java b/trunk/src/com/jpexs/helpers/Helper.java index 4e76481c6..1e921f578 100644 --- a/trunk/src/com/jpexs/helpers/Helper.java +++ b/trunk/src/com/jpexs/helpers/Helper.java @@ -552,7 +552,7 @@ public class Helper { THREAD_POOL.execute(task); return task.get(timeout, timeUnit); } - + public static boolean contains(int[] array, int value) { for (int i : array) { if (i == value) { @@ -561,15 +561,15 @@ public class Helper { } return false; } - - public static void saveStream(InputStream is,File output) throws IOException { - byte[] buf=new byte[1024]; + + public static void saveStream(InputStream is, File output) throws IOException { + byte[] buf = new byte[1024]; int cnt; try (FileOutputStream fos = new FileOutputStream(output)) { - while((cnt=is.read(buf))>0){ - fos.write(buf,0,cnt); + while ((cnt = is.read(buf)) > 0) { + fos.write(buf, 0, cnt); fos.flush(); - } + } } } } diff --git a/trunk/src/com/jpexs/helpers/LimitedInputStream.java b/trunk/src/com/jpexs/helpers/LimitedInputStream.java index d6c82f468..f5ffaa7eb 100644 --- a/trunk/src/com/jpexs/helpers/LimitedInputStream.java +++ b/trunk/src/com/jpexs/helpers/LimitedInputStream.java @@ -31,7 +31,7 @@ public class LimitedInputStream extends InputStream { public int available() throws IOException { int avail = is.available(); if (pos + avail > limit) { - avail = (int)(limit - pos); + avail = (int) (limit - pos); } return avail; } diff --git a/trunk/src/com/jpexs/helpers/ReReadableInputStream.java b/trunk/src/com/jpexs/helpers/ReReadableInputStream.java index dfa0662ea..43186dca6 100644 --- a/trunk/src/com/jpexs/helpers/ReReadableInputStream.java +++ b/trunk/src/com/jpexs/helpers/ReReadableInputStream.java @@ -62,7 +62,7 @@ public class ReReadableInputStream extends InputStream { if (converted == null) { converted = baos.toByteArray(); } - int ret = converted[(int)pos] & 0xff; + int ret = converted[(int) pos] & 0xff; pos++; return ret; } @@ -79,7 +79,7 @@ public class ReReadableInputStream extends InputStream { @Override public int available() throws IOException { - return (count + is.available()) - (int)pos; + return (count + is.available()) - (int) pos; } public long length() throws IOException { diff --git a/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java b/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java index b284316a6..220ca9c75 100644 --- a/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java +++ b/trunk/test/com/jpexs/decompiler/flash/ActionScript2AssemblerTest.java @@ -55,9 +55,7 @@ public class ActionScript2AssemblerTest { assertEquals(actualResult.trim(), "ok = false;"); assertTrue(decompiled.contains("Push \"ok\" false")); - } catch (IOException ex) { - fail(); - } catch (ParseException ex) { + } catch (IOException | ParseException ex) { fail(); } }