From db825ce26eae3e253bdf851fdfa7fbfc452ff932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Fri, 12 Jun 2015 15:25:16 +0200 Subject: [PATCH 1/2] SWF version 29 to flash player 18 mapping --- .../ffdec_lib/src/com/jpexs/decompiler/flash/xfl/FLAVersion.java | 1 + 1 file changed, 1 insertion(+) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/FLAVersion.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/FLAVersion.java index b15da3899..a2372b4f4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/FLAVersion.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/FLAVersion.java @@ -66,6 +66,7 @@ public enum FLAVersion { versionToPlayerMap.put(26, "FlashPlayer15.0"); versionToPlayerMap.put(27, "FlashPlayer16.0"); versionToPlayerMap.put(28, "FlashPlayer17.0"); + versionToPlayerMap.put(29, "FlashPlayer18.0"); } private FLAVersion(String shortName, String applicationName, String xflVersion, int maxSwfVersion) { From 2503f1093d8b77007081a79625ffd94748ed56aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 13 Jun 2015 07:11:38 +0200 Subject: [PATCH 2/2] Oficial tag names (DoABCDefine tag renamed to DoABC2 for example) --- .../decompiler/flash/SWFInputStream.java | 21 +- .../avm2/parser/script/ActionScriptLexer.java | 4465 ++++++++--------- .../{DoABCDefineTag.java => DoABC2Tag.java} | 12 +- .../com/jpexs/decompiler/flash/tags/Tag.java | 4 +- .../decompiler/flash/ActionScript3Test.java | 1890 +++---- .../flash/generators/AS2Generator.java | 7 +- .../flash/generators/AS3Generator.java | 8 +- .../flash/gui/tagtree/TagIdClassMap.java | 410 +- .../decompiler/flash/gui/tagtree/TagTree.java | 1308 ++--- 9 files changed, 3952 insertions(+), 4173 deletions(-) rename libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/{DoABCDefineTag.java => DoABC2Tag.java} (92%) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java index 2ee2234fb..d68c6c1af 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -155,7 +155,7 @@ import com.jpexs.decompiler.flash.tags.DefineSpriteTag; import com.jpexs.decompiler.flash.tags.DefineText2Tag; import com.jpexs.decompiler.flash.tags.DefineTextTag; import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; -import com.jpexs.decompiler.flash.tags.DoABCDefineTag; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; import com.jpexs.decompiler.flash.tags.DoABCTag; import com.jpexs.decompiler.flash.tags.DoActionTag; import com.jpexs.decompiler.flash.tags.DoInitActionTag; @@ -1268,7 +1268,7 @@ public class SWFInputStream implements AutoCloseable { case 24: ret = new ProtectTag(sis, data); break; - //case 25: PathsArePostscript + //case 25: PathsArePostScript case 26: ret = new PlaceObject2Tag(sis, data); break; @@ -1297,7 +1297,7 @@ public class SWFInputStream implements AutoCloseable { case 37: ret = new DefineEditTextTag(sis, data); break; - //case 38: DefineVideo + //case 38: DefineMouseTarget (DefineVideo?) case 39: ret = new DefineSpriteTag(sis, level, data, parallel, skipUnusualTags); break; @@ -1316,14 +1316,14 @@ public class SWFInputStream implements AutoCloseable { case 46: ret = new DefineMorphShapeTag(sis, data); break; - //case 47: GenerateFrame + //case 47: FrameTag case 48: ret = new DefineFont2Tag(sis, data); break; - //case 49: GeneratorCommand - //case 50: DefineCommandObject + //case 49: GenCommand + //case 50: DefineCommandObj //case 51: CharacterSet - //case 52: ExternalFont + //case 52: FontRef //case 53: DefineFunction //case 54: PlaceFunction //case 55: GenTagObject @@ -1392,9 +1392,10 @@ public class SWFInputStream implements AutoCloseable { case 78: ret = new DefineScalingGridTag(sis, data); break; - //case 79-81: + //case 79: DefineDeviceVideo + //case 80-81: case 82: - ret = new DoABCDefineTag(sis, data); + ret = new DoABC2Tag(sis, data); break; case 83: ret = new DefineShape4Tag(sis, data, lazy); @@ -1402,7 +1403,7 @@ public class SWFInputStream implements AutoCloseable { case 84: ret = new DefineMorphShape2Tag(sis, data); break; - //case 85: + //case 85: PlaceImagePrivate case 86: ret = new DefineSceneAndFrameLabelDataTag(sis, data); break; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java index d3d5d869f..cb9f3624b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java @@ -1,2344 +1,2121 @@ -/* The following code was generated by JFlex 1.6.0 */ - -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash.abc.avm2.parser.script; - -import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -/** - * This class is a scanner generated by - * JFlex 1.6.0 - * from the specification file - * C:/Projects/FFDec/jpexs-decompiler/libsrc/ffdec_lib/lexers/actionscript3_script.flex - */ -public final class ActionScriptLexer { - - /** - * This character denotes the end of file - */ - public static final int YYEOF = -1; - - /** - * initial size of the lookahead buffer - */ - private static final int ZZ_BUFFERSIZE = 16384; - - /** - * lexical states - */ - public static final int YYINITIAL = 0; - - public static final int STRING = 2; - - public static final int CHARLITERAL = 4; - - public static final int XMLOPENTAG = 6; - - public static final int XMLOPENTAGATTRIB = 8; - - public static final int XMLINSTROPENTAG = 10; - - public static final int XMLINSTRATTRIB = 12; - - public static final int XMLCDATA = 14; - - public static final int XMLCOMMENT = 16; - - public static final int XML = 18; - - public static final int OIDENTIFIER = 20; - - /** - * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l - * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l - * at the beginning of a line - * l is of the form l = 2*k, k a non negative integer - */ - private static final int ZZ_LEXSTATE[] = { - 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, - 8, 8, 9, 9, 10, 10 - }; - - /** - * Translates characters to character classes - */ - private static final String ZZ_CMAP_PACKED - = "\11\0\1\13\1\2\1\113\1\3\1\1\22\0\1\13\1\14\1\33" - + "\1\0\1\6\1\110\1\105\1\34\1\76\1\77\1\5\1\45\1\103" - + "\1\15\1\11\1\4\1\35\3\41\4\42\2\21\1\17\1\102\1\12" - + "\1\32\1\16\1\23\1\111\1\27\1\20\1\25\1\26\1\43\1\20" - + "\2\10\1\74\4\10\1\75\5\10\1\30\3\10\1\37\2\10\1\24" - + "\1\46\1\31\1\107\1\10\1\0\1\52\1\50\1\54\1\63\1\44" - + "\1\40\1\73\1\66\1\61\1\10\1\53\1\64\1\71\1\57\1\56" - + "\1\67\1\10\1\51\1\55\1\60\1\62\1\72\1\65\1\36\1\70" - + "\1\10\1\100\1\106\1\101\1\104\6\0\1\113\41\0\1\47\2\0" - + "\1\6\12\0\1\6\1\0\1\22\2\0\1\6\5\0\2\6\1\112" - + "\24\6\1\0\37\6\1\0\u01ca\6\4\0\14\6\16\0\5\6\7\0" - + "\1\6\1\0\1\6\21\0\160\7\5\6\1\0\2\6\2\0\4\6" - + "\1\0\1\6\6\0\1\6\1\0\3\6\1\0\1\6\1\0\24\6" - + "\1\0\123\6\1\0\213\6\1\0\5\7\2\0\246\6\1\0\46\6" - + "\2\0\1\6\7\0\47\6\11\0\55\7\1\0\1\7\1\0\2\7" - + "\1\0\2\7\1\0\1\7\10\0\33\6\5\0\3\6\35\0\13\7" - + "\5\0\53\6\37\7\4\0\2\6\1\7\143\6\1\0\1\6\7\7" - + "\2\0\6\7\2\6\2\7\1\0\4\7\2\6\12\7\3\6\2\0" - + "\1\6\20\0\1\6\1\7\36\6\33\7\2\0\131\6\13\7\1\6" - + "\16\0\12\7\41\6\11\7\2\6\4\0\1\6\5\0\26\6\4\7" - + "\1\6\11\7\1\6\3\7\1\6\5\7\22\0\31\6\3\7\104\0" - + "\23\6\61\0\40\7\66\6\3\7\1\6\22\7\1\6\7\7\12\6" - + "\2\7\2\0\12\7\1\0\20\6\3\7\1\0\10\6\2\0\2\6" - + "\2\0\26\6\1\0\7\6\1\0\1\6\3\0\4\6\2\0\1\7" - + "\1\6\7\7\2\0\2\7\2\0\3\7\1\6\10\0\1\7\4\0" - + "\2\6\1\0\3\6\2\7\2\0\12\7\2\6\17\0\3\7\1\0" - + "\6\6\4\0\2\6\2\0\26\6\1\0\7\6\1\0\2\6\1\0" - + "\2\6\1\0\2\6\2\0\1\7\1\0\5\7\4\0\2\7\2\0" - + "\3\7\3\0\1\7\7\0\4\6\1\0\1\6\7\0\14\7\3\6" - + "\1\7\13\0\3\7\1\0\11\6\1\0\3\6\1\0\26\6\1\0" - + "\7\6\1\0\2\6\1\0\5\6\2\0\1\7\1\6\10\7\1\0" - + "\3\7\1\0\3\7\2\0\1\6\17\0\2\6\2\7\2\0\12\7" - + "\21\0\3\7\1\0\10\6\2\0\2\6\2\0\26\6\1\0\7\6" - + "\1\0\2\6\1\0\5\6\2\0\1\7\1\6\7\7\2\0\2\7" - + "\2\0\3\7\10\0\2\7\4\0\2\6\1\0\3\6\2\7\2\0" - + "\12\7\1\0\1\6\20\0\1\7\1\6\1\0\6\6\3\0\3\6" - + "\1\0\4\6\3\0\2\6\1\0\1\6\1\0\2\6\3\0\2\6" - + "\3\0\3\6\3\0\14\6\4\0\5\7\3\0\3\7\1\0\4\7" - + "\2\0\1\6\6\0\1\7\16\0\12\7\20\0\4\7\1\0\10\6" - + "\1\0\3\6\1\0\27\6\1\0\20\6\3\0\1\6\7\7\1\0" - + "\3\7\1\0\4\7\7\0\2\7\1\0\2\6\6\0\2\6\2\7" - + "\2\0\12\7\21\0\3\7\1\0\10\6\1\0\3\6\1\0\27\6" - + "\1\0\12\6\1\0\5\6\2\0\1\7\1\6\7\7\1\0\3\7" - + "\1\0\4\7\7\0\2\7\7\0\1\6\1\0\2\6\2\7\2\0" - + "\12\7\1\0\2\6\16\0\3\7\1\0\10\6\1\0\3\6\1\0" - + "\51\6\2\0\1\6\7\7\1\0\3\7\1\0\4\7\1\6\10\0" - + "\1\7\10\0\2\6\2\7\2\0\12\7\12\0\6\6\2\0\2\7" - + "\1\0\22\6\3\0\30\6\1\0\11\6\1\0\1\6\2\0\7\6" - + "\3\0\1\7\4\0\6\7\1\0\1\7\1\0\10\7\6\0\12\7" - + "\2\0\2\7\15\0\60\6\1\7\2\6\7\7\5\0\7\6\10\7" - + "\1\0\12\7\47\0\2\6\1\0\1\6\2\0\2\6\1\0\1\6" - + "\2\0\1\6\6\0\4\6\1\0\7\6\1\0\3\6\1\0\1\6" - + "\1\0\1\6\2\0\2\6\1\0\4\6\1\7\2\6\6\7\1\0" - + "\2\7\1\6\2\0\5\6\1\0\1\6\1\0\6\7\2\0\12\7" - + "\2\0\4\6\40\0\1\6\27\0\2\7\6\0\12\7\13\0\1\7" - + "\1\0\1\7\1\0\1\7\4\0\2\7\10\6\1\0\44\6\4\0" - + "\24\7\1\0\2\7\5\6\13\7\1\0\44\7\11\0\1\7\71\0" - + "\53\6\24\7\1\6\12\7\6\0\6\6\4\7\4\6\3\7\1\6" - + "\3\7\2\6\7\7\3\6\4\7\15\6\14\7\1\6\17\7\2\0" - + "\46\6\1\0\1\6\5\0\1\6\2\0\53\6\1\0\u014d\6\1\0" - + "\4\6\2\0\7\6\1\0\1\6\1\0\4\6\2\0\51\6\1\0" - + "\4\6\2\0\41\6\1\0\4\6\2\0\7\6\1\0\1\6\1\0" - + "\4\6\2\0\17\6\1\0\71\6\1\0\4\6\2\0\103\6\2\0" - + "\3\7\40\0\20\6\20\0\125\6\14\0\u026c\6\2\0\21\6\1\0" - + "\32\6\5\0\113\6\3\0\3\7\10\6\7\0\15\6\1\0\4\6" - + "\3\7\13\0\22\6\3\7\13\0\22\6\2\7\14\0\15\6\1\0" - + "\3\6\1\0\2\7\14\0\64\6\40\7\3\0\1\6\4\0\1\6" - + "\1\7\2\0\12\7\41\0\3\7\2\0\12\7\6\0\130\6\10\0" - + "\51\6\1\7\1\6\5\0\106\6\12\0\37\6\1\0\14\7\4\0" - + "\14\7\12\0\12\7\36\6\2\0\5\6\13\0\54\6\4\0\21\7" - + "\7\6\2\7\6\0\12\7\46\0\27\6\5\7\4\0\65\6\12\7" - + "\1\0\35\7\2\0\13\7\6\0\12\7\15\0\1\6\10\0\16\7" - + "\102\0\5\7\57\6\21\7\7\6\4\0\12\7\21\0\11\7\14\0" - + "\3\7\36\6\15\7\2\6\12\7\54\6\16\7\14\0\44\6\24\7" - + "\10\0\12\7\3\0\3\6\12\7\44\6\122\0\3\7\1\0\25\7" - + "\4\6\1\7\4\6\3\7\2\6\1\0\2\7\6\0\300\6\66\7" - + "\6\0\4\7\u0116\6\2\0\6\6\2\0\46\6\2\0\6\6\2\0" - + "\10\6\1\0\1\6\1\0\1\6\1\0\1\6\1\0\37\6\2\0" - + "\65\6\1\0\7\6\1\0\1\6\3\0\3\6\1\0\7\6\3\0" - + "\4\6\2\0\6\6\4\0\15\6\5\0\3\6\1\0\7\6\3\0" - + "\14\0\2\0\32\0\1\113\1\113\25\0\2\7\23\0\1\7\33\0" - + "\1\0\1\6\15\0\1\6\20\0\15\6\63\0\15\7\4\0\1\7" - + "\3\0\14\7\21\0\1\6\4\0\1\6\2\0\12\6\1\0\1\6" - + "\3\0\5\6\6\0\1\6\1\0\1\6\1\0\1\6\1\0\4\6" - + "\1\0\13\6\2\0\4\6\5\0\5\6\4\0\1\6\21\0\43\7" - + "\2\6\4\7\7\0\u0a70\0\57\6\1\0\57\6\1\0\205\6\6\0" - + "\4\6\3\7\2\6\14\0\46\6\1\0\1\6\5\0\1\6\2\0" - + "\70\6\7\0\1\6\17\0\1\7\27\6\11\0\7\6\1\0\7\6" - + "\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6" - + "\1\0\7\6\1\0\40\7\57\0\1\6\u01c0\0\21\0\4\0\2\6" - + "\1\7\31\0\17\7\1\0\5\6\2\0\3\7\2\6\4\0\126\6" - + "\2\0\2\7\2\0\3\6\1\0\132\6\1\0\4\6\5\0\51\6" - + "\3\0\136\6\21\0\33\6\65\0\20\6\u0200\0\u19b6\6\112\0\u51cd\6" - + "\63\0\u048d\6\103\0\56\6\2\0\u010d\6\3\0\20\6\12\7\2\6" - + "\24\0\57\6\1\7\4\0\12\7\1\0\37\6\1\0\1\7\106\6" - + "\14\7\45\0\11\6\2\0\147\6\2\0\4\6\1\0\36\6\2\0" - + "\2\6\105\0\13\6\1\7\3\6\1\7\4\6\1\7\27\6\5\7" - + "\30\0\64\6\14\0\2\7\62\6\21\7\13\0\12\7\6\0\22\7" - + "\6\6\3\0\1\6\4\0\12\7\34\6\10\7\2\0\27\6\15\7" - + "\14\0\35\6\3\0\4\7\57\6\16\7\16\0\1\6\12\7\6\0" - + "\5\6\1\7\12\6\12\7\5\6\1\0\51\6\16\7\11\0\3\6" - + "\1\7\10\6\2\7\2\0\12\7\6\0\27\6\3\0\1\6\3\7" - + "\62\6\1\7\1\6\3\7\2\6\2\7\5\6\2\7\1\6\1\7" - + "\1\6\30\0\3\6\2\0\13\6\5\7\2\0\3\6\2\7\12\0" - + "\6\6\2\0\6\6\2\0\6\6\11\0\7\6\1\0\7\6\1\0" - + "\53\6\1\0\4\6\4\0\2\6\132\0\43\6\10\7\1\0\2\7" - + "\2\0\12\7\6\0\u2ba4\6\14\0\27\6\4\0\61\6\4\0\u1800\0" - + "\u0900\0\u016e\6\2\0\152\6\46\0\7\6\14\0\5\6\5\0\1\6" - + "\1\7\12\6\1\0\15\6\1\0\5\6\1\0\1\6\1\0\2\6" - + "\1\0\2\6\1\0\154\6\41\0\u016b\6\22\0\100\6\2\0\66\6" - + "\10\0\40\0\14\6\4\0\20\7\20\0\16\7\5\0\2\7\30\0" - + "\3\7\40\0\5\6\1\0\207\6\23\0\12\7\7\0\32\6\4\0" - + "\1\7\1\0\32\6\13\0\131\6\3\0\6\6\2\0\6\6\2\0" - + "\6\6\2\0\3\6\41\0\2\0\14\6\1\0\32\6\1\0\23\6" - + "\1\0\2\6\1\0\17\6\2\0\16\6\42\0\173\6\105\0\65\7" - + "\210\0\1\7\202\0\35\6\3\0\61\6\17\0\1\7\37\0\40\6" - + "\20\0\21\6\1\7\10\6\1\7\5\0\46\6\5\7\5\0\36\6" - + "\2\0\44\6\4\0\10\6\1\0\5\7\52\0\236\6\2\0\12\7" - + "\126\0\50\6\10\0\64\6\234\0\u0137\6\11\0\26\6\12\0\10\6" - + "\230\0\6\6\2\0\1\6\1\0\54\6\1\0\2\6\3\0\1\6" - + "\2\0\27\6\12\0\27\6\11\0\37\6\141\0\26\6\12\0\32\6" - + "\106\0\70\6\6\0\2\6\100\0\1\6\3\7\1\0\2\7\5\0" - + "\4\7\4\6\1\0\3\6\1\0\33\6\4\0\3\7\4\0\1\7" - + "\40\0\35\6\3\0\35\6\43\0\10\6\1\0\34\6\2\7\31\0" - + "\66\6\12\0\26\6\12\0\23\6\15\0\22\6\156\0\111\6\u03b7\0" - + "\3\7\65\6\17\7\37\0\12\7\17\0\4\7\55\6\13\7\25\0" - + "\31\6\7\0\12\7\6\0\3\7\44\6\16\7\1\0\12\7\20\0" - + "\43\6\1\7\2\0\1\6\11\0\3\7\60\6\16\7\4\6\13\0" - + "\12\7\1\6\45\0\22\6\1\0\31\6\14\7\170\0\57\6\14\7" - + "\5\0\12\7\7\0\3\7\1\0\10\6\2\0\2\6\2\0\26\6" - + "\1\0\7\6\1\0\2\6\1\0\5\6\2\0\1\7\1\6\7\7" - + "\2\0\2\7\2\0\3\7\11\0\1\7\5\0\5\6\2\7\2\0" - + "\7\7\3\0\5\7\u010b\0\60\6\24\7\2\6\1\0\1\6\10\0" - + "\12\7\246\0\57\6\7\7\2\0\11\7\77\0\60\6\21\7\3\0" - + "\1\6\13\0\12\7\46\0\53\6\15\7\10\0\12\7\u01d6\0\100\6" - + "\12\7\25\0\1\6\u01c0\0\71\6\u0507\0\u0399\6\147\0\157\7\u0b91\0" - + "\u042f\6\u33d1\0\u0239\6\7\0\37\6\1\0\12\7\146\0\36\6\2\0" - + "\5\7\13\0\60\6\7\7\11\0\4\6\14\0\12\7\11\0\25\6" - + "\5\0\23\6\u0370\0\105\6\13\0\1\6\56\7\20\0\4\7\15\6" - + "\u4060\0\2\6\u0bfe\0\153\6\5\0\15\6\3\0\11\6\7\0\12\6" - + "\3\0\2\7\u14c6\0\5\7\3\0\6\7\10\0\10\7\2\0\7\7" - + "\36\0\4\7\224\0\3\7\u01bb\0\125\6\1\0\107\6\1\0\2\6" - + "\2\0\1\6\2\0\2\6\2\0\4\6\1\0\14\6\1\0\1\6" - + "\1\0\7\6\1\0\101\6\1\0\4\6\2\0\10\6\1\0\7\6" - + "\1\0\34\6\1\0\4\6\1\0\5\6\1\0\1\6\3\0\7\6" - + "\1\0\u0154\6\2\0\31\6\1\0\31\6\1\0\37\6\1\0\31\6" - + "\1\0\37\6\1\0\31\6\1\0\37\6\1\0\31\6\1\0\37\6" - + "\1\0\31\6\1\0\10\6\2\0\62\7\u1000\0\305\6\13\0\7\7" - + "\u0529\0\4\6\1\0\33\6\1\0\2\6\1\0\1\6\2\0\1\6" - + "\1\0\12\6\1\0\4\6\1\0\1\6\1\0\1\6\6\0\1\6" - + "\4\0\1\6\1\0\1\6\1\0\1\6\1\0\3\6\1\0\2\6" - + "\1\0\1\6\2\0\1\6\1\0\1\6\1\0\1\6\1\0\1\6" - + "\1\0\1\6\1\0\2\6\1\0\1\6\2\0\4\6\1\0\7\6" - + "\1\0\4\6\1\0\4\6\1\0\1\6\1\0\12\6\1\0\21\6" - + "\5\0\3\6\1\0\5\6\1\0\21\6\u1144\0\ua6d7\6\51\0\u1035\6" - + "\13\0\336\6\u3fe2\0\u021e\6\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\u06ed\0" - + "\360\7\uffff\0\uffff\0\ufe12\0"; - - /** - * Translates characters to character classes - */ - private static final char[] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); - - /** - * Translates DFA states to action switch labels. - */ - private static final int[] ZZ_ACTION = zzUnpackAction(); - - private static final String ZZ_ACTION_PACKED_0 - = "\13\0\1\1\2\2\1\3\1\4\1\5\1\6\1\7" - + "\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17" - + "\1\20\1\21\1\22\1\23\1\15\2\6\1\24\1\25" - + "\21\6\1\26\1\27\1\30\1\31\1\32\1\33\1\34" - + "\1\35\1\36\1\37\1\40\1\41\1\42\2\43\1\44" - + "\1\1\1\42\2\45\2\46\1\42\2\1\1\47\1\50" - + "\1\1\1\51\2\1\1\52\1\1\1\53\2\42\2\54" - + "\2\42\1\55\1\42\1\1\1\56\1\3\1\0\1\57" - + "\1\60\1\61\1\62\1\63\1\64\1\65\1\66\1\67" - + "\1\70\1\71\1\72\1\73\1\74\1\75\1\76\1\0" - + "\1\77\1\63\1\100\1\0\2\100\7\6\1\101\1\102" - + "\2\6\1\103\16\6\1\104\1\105\1\106\4\6\1\107" - + "\13\6\1\110\1\111\1\112\1\113\1\114\1\115\1\116" - + "\1\117\1\120\1\116\1\121\1\122\1\123\1\124\1\125" - + "\1\126\1\116\1\127\1\0\1\130\1\0\1\131\1\0" - + "\1\132\1\133\1\0\1\134\4\0\1\135\2\0\1\136" - + "\4\137\2\3\2\0\1\140\1\141\1\142\1\143\1\144" - + "\1\0\1\63\1\145\2\146\1\100\1\6\1\147\13\6" - + "\1\150\4\6\1\151\4\6\1\152\6\6\1\153\12\6" - + "\1\154\1\6\1\155\1\6\1\156\3\0\1\134\1\157" - + "\1\160\1\0\1\161\2\0\1\162\1\163\1\164\1\0" - + "\1\165\1\146\1\100\4\6\1\166\1\167\2\6\1\170" - + "\12\6\1\171\1\172\1\6\1\173\11\6\1\174\5\6" - + "\1\175\1\6\1\176\2\0\1\177\1\200\1\0\1\146" - + "\1\100\1\201\1\202\2\6\1\203\1\6\1\204\1\205" - + "\1\6\1\206\1\6\1\207\4\6\1\210\11\6\1\211" - + "\5\6\1\0\1\146\1\100\3\6\1\212\1\6\1\213" - + "\1\214\1\6\1\215\1\6\1\216\3\6\1\217\3\6" - + "\1\220\4\6\1\221\1\6\1\0\1\146\1\100\1\222" - + "\1\6\1\223\10\6\1\224\1\225\1\6\1\226\1\227" - + "\1\6\1\0\1\146\1\100\1\230\1\231\1\232\3\6" - + "\1\233\3\6\1\234\1\0\1\146\1\100\1\235\1\6" - + "\1\236\1\6\1\237\1\240\1\241\1\146\1\100\1\242" - + "\1\243\6\100"; - - private static int[] zzUnpackAction() { - int[] result = new int[446]; - int offset = 0; - offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAction(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ - - int j = offset; /* index in unpacked array */ - - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do { - result[j++] = value; - } while (--count > 0); - } - return j; - } - - /** - * Translates a state to a row index in the transition table - */ - private static final int[] ZZ_ROWMAP = zzUnpackRowMap(); - - private static final String ZZ_ROWMAP_PACKED_0 - = "\0\0\0\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214" - + "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u0344\0\u03dc\0\u0428" - + "\0\u0474\0\u04c0\0\u050c\0\u0558\0\u05a4\0\u05f0\0\u063c\0\u0688" - + "\0\u06d4\0\u0344\0\u0344\0\u0344\0\u0720\0\u0344\0\u0344\0\u076c" - + "\0\u07b8\0\u0804\0\u0850\0\u0344\0\u089c\0\u08e8\0\u0934\0\u0980" - + "\0\u09cc\0\u0a18\0\u0a64\0\u0ab0\0\u0afc\0\u0b48\0\u0b94\0\u0be0" - + "\0\u0c2c\0\u0c78\0\u0cc4\0\u0d10\0\u0d5c\0\u0344\0\u0344\0\u0344" - + "\0\u0344\0\u0344\0\u0344\0\u0344\0\u0da8\0\u0df4\0\u0e40\0\u0e8c" - + "\0\u0344\0\u0ed8\0\u0f24\0\u0344\0\u0344\0\u0f70\0\u0fbc\0\u1008" - + "\0\u0344\0\u1054\0\u0344\0\u10a0\0\u10ec\0\u1138\0\u0344\0\u0344" - + "\0\u1184\0\u0344\0\u11d0\0\u121c\0\u0344\0\u1268\0\u0344\0\u0344" - + "\0\u12b4\0\u1300\0\u0344\0\u134c\0\u1398\0\u0344\0\u13e4\0\u1430" - + "\0\u0344\0\u147c\0\u14c8\0\u0344\0\u0344\0\u1514\0\u0344\0\u1560" - + "\0\u0344\0\u15ac\0\u15f8\0\u0344\0\u0344\0\u1644\0\u0344\0\u0344" - + "\0\u1690\0\u0344\0\u0344\0\u16dc\0\u1728\0\u1774\0\u17c0\0\u180c" - + "\0\u1858\0\u18a4\0\u18f0\0\u193c\0\u1988\0\u19d4\0\u1a20\0\u1a6c" - + "\0\u1ab8\0\u0344\0\u0344\0\u1b04\0\u1b50\0\u04c0\0\u1b9c\0\u1be8" - + "\0\u1c34\0\u1c80\0\u1ccc\0\u1d18\0\u1d64\0\u1db0\0\u1dfc\0\u1e48" - + "\0\u1e94\0\u1ee0\0\u1f2c\0\u1f78\0\u04c0\0\u04c0\0\u1fc4\0\u2010" - + "\0\u205c\0\u20a8\0\u20f4\0\u04c0\0\u2140\0\u218c\0\u21d8\0\u2224" - + "\0\u2270\0\u22bc\0\u2308\0\u2354\0\u23a0\0\u23ec\0\u2438\0\u0344" - + "\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344" - + "\0\u2484\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u24d0" - + "\0\u0344\0\u1138\0\u0344\0\u1184\0\u0344\0\u11d0\0\u0344\0\u0344" - + "\0\u1268\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u2698\0\u26e4" - + "\0\u2730\0\u0344\0\u0344\0\u2484\0\u24d0\0\u277c\0\u27c8\0\u0344" - + "\0\u2814\0\u2860\0\u0344\0\u0344\0\u0344\0\u28ac\0\u0344\0\u28f8" - + "\0\u28f8\0\u0344\0\u2944\0\u180c\0\u2990\0\u29dc\0\u04c0\0\u2a28" - + "\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4\0\u2bf0\0\u2c3c\0\u2c88" - + "\0\u2cd4\0\u2d20\0\u04c0\0\u2d6c\0\u2db8\0\u2e04\0\u2e50\0\u04c0" - + "\0\u2e9c\0\u2ee8\0\u2f34\0\u2f80\0\u04c0\0\u2fcc\0\u3018\0\u3064" - + "\0\u30b0\0\u30fc\0\u3148\0\u04c0\0\u3194\0\u31e0\0\u322c\0\u3278" - + "\0\u32c4\0\u3310\0\u335c\0\u33a8\0\u33f4\0\u3440\0\u04c0\0\u348c" - + "\0\u04c0\0\u34d8\0\u04c0\0\u3524\0\u3570\0\u251c\0\u0344\0\u0344" - + "\0\u0344\0\u35bc\0\u0344\0\u3608\0\u3654\0\u36a0\0\u0344\0\u0344" - + "\0\u36ec\0\u0344\0\u3738\0\u3784\0\u37d0\0\u381c\0\u3868\0\u38b4" - + "\0\u04c0\0\u04c0\0\u3900\0\u394c\0\u04c0\0\u3998\0\u39e4\0\u3a30" - + "\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60\0\u3bac\0\u3bf8\0\u3c44\0\u04c0" - + "\0\u04c0\0\u3c90\0\u04c0\0\u3cdc\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c" - + "\0\u3e58\0\u3ea4\0\u3ef0\0\u3f3c\0\u04c0\0\u3f88\0\u3fd4\0\u4020" - + "\0\u406c\0\u40b8\0\u04c0\0\u4104\0\u0344\0\u2484\0\u4150\0\u0344" - + "\0\u0344\0\u419c\0\u41e8\0\u4234\0\u04c0\0\u4280\0\u42cc\0\u4318" - + "\0\u04c0\0\u4364\0\u04c0\0\u04c0\0\u43b0\0\u04c0\0\u43fc\0\u04c0" - + "\0\u4448\0\u4494\0\u44e0\0\u452c\0\u04c0\0\u4578\0\u45c4\0\u4610" - + "\0\u465c\0\u46a8\0\u46f4\0\u4740\0\u478c\0\u47d8\0\u04c0\0\u4824" - + "\0\u4870\0\u48bc\0\u4908\0\u4954\0\u49a0\0\u49ec\0\u4a38\0\u4a84" - + "\0\u4ad0\0\u4b1c\0\u04c0\0\u4b68\0\u04c0\0\u04c0\0\u4bb4\0\u04c0" - + "\0\u4c00\0\u04c0\0\u4c4c\0\u4c98\0\u4ce4\0\u04c0\0\u4d30\0\u4d7c" - + "\0\u4dc8\0\u04c0\0\u4e14\0\u4e60\0\u4eac\0\u4ef8\0\u04c0\0\u4f44" - + "\0\u4f90\0\u4fdc\0\u5028\0\u04c0\0\u5074\0\u04c0\0\u50c0\0\u510c" - + "\0\u5158\0\u51a4\0\u51f0\0\u523c\0\u5288\0\u52d4\0\u04c0\0\u04c0" - + "\0\u5320\0\u04c0\0\u04c0\0\u536c\0\u53b8\0\u5404\0\u5450\0\u04c0" - + "\0\u04c0\0\u04c0\0\u549c\0\u54e8\0\u5534\0\u04c0\0\u5580\0\u55cc" - + "\0\u5618\0\u04c0\0\u5664\0\u56b0\0\u56fc\0\u04c0\0\u5748\0\u04c0" - + "\0\u5794\0\u04c0\0\u04c0\0\u0344\0\u0344\0\u57e0\0\u04c0\0\u04c0" - + "\0\u582c\0\u5878\0\u58c4\0\u5910\0\u595c\0\u1774"; - - private static int[] zzUnpackRowMap() { - int[] result = new int[446]; - int offset = 0; - offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackRowMap(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ - - int j = offset; /* index in unpacked array */ - - int l = packed.length(); - while (i < l) { - int high = packed.charAt(i++) << 16; - result[j++] = high | packed.charAt(i++); - } - return j; - } - - /** - * The transition table of the DFA - */ - private static final int[] ZZ_TRANS = zzUnpackTrans(); - - private static final String ZZ_TRANS_PACKED_0 - = "\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\14" - + "\1\22\1\23\1\24\1\17\1\25\1\26\1\27\1\30" - + "\1\22\1\31\1\14\1\32\1\33\4\22\1\34\1\35" - + "\1\36\1\37\1\40\2\22\1\41\2\31\1\22\1\42" - + "\1\43\1\14\1\44\1\45\1\46\1\47\1\22\1\50" - + "\1\51\1\52\1\53\1\54\1\55\1\56\1\57\1\22" - + "\1\60\1\22\1\61\2\22\1\62\1\63\1\64\1\65" - + "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75" - + "\1\76\1\77\1\100\1\101\1\22\1\14\1\102\1\103" - + "\1\104\30\102\1\105\12\102\1\106\45\102\1\107\1\110" - + "\1\111\31\107\1\105\11\107\1\106\45\107\1\14\1\112" - + "\1\113\1\114\1\115\3\14\1\116\2\14\1\114\2\14" - + "\1\117\2\116\4\14\4\116\5\14\3\116\2\14\2\116" - + "\3\14\26\116\2\14\1\120\46\14\1\121\44\14\1\122" - + "\14\14\1\112\1\113\1\114\4\14\1\123\2\14\1\114" - + "\3\14\2\123\2\14\1\124\1\14\4\123\5\14\3\123" - + "\2\14\2\123\3\14\26\123\2\14\1\125\46\14\1\126" - + "\44\14\1\127\13\14\1\130\1\112\1\113\26\130\1\131" - + "\63\130\1\132\1\133\12\130\1\134\77\130\1\112\1\113" - + "\7\130\1\135\65\130\1\136\13\130\1\137\1\110\1\111" - + "\43\137\1\140\1\141\44\137\116\0\1\16\114\0\1\17" - + "\7\0\1\17\104\0\1\142\1\143\24\0\1\144\113\0" - + "\1\145\67\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\26\22\14\0\1\22\12\0\1\146\1\147" - + "\6\0\1\150\13\0\1\150\3\0\2\150\33\0\1\151" - + "\25\0\1\152\1\0\1\153\4\0\2\152\4\0\4\152" - + "\1\0\1\154\3\0\3\152\2\0\2\152\3\0\26\152" - + "\2\0\1\155\45\0\1\156\76\0\1\157\14\0\1\160" - + "\77\0\1\161\13\0\1\162\100\0\1\163\105\0\1\150" - + "\7\0\1\31\13\0\1\31\3\0\2\31\2\164\101\0" - + "\1\165\72\0\1\150\7\0\1\166\13\0\1\167\2\170" - + "\1\0\1\171\1\172\2\164\55\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\2\22\1\173\3\22" - + "\1\174\2\22\1\175\1\176\13\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\1\22\1\177" - + "\6\22\3\0\2\22\1\200\11\22\1\201\11\22\14\0" - + "\1\22\33\0\1\202\12\0\1\203\54\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\1\22\1\204" - + "\24\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\7\22\1\205\3\0\26\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\5\22\1\206\20\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22" - + "\1\207\3\22\1\210\5\22\1\211\11\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22" - + "\1\212\3\0\10\22\1\213\1\22\1\214\2\22\1\215" - + "\10\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\22\22\1\216\3\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\7\22\1\217\3\0\2\22\1\220\7\22\1\221\13\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\1\22\1\222\14\22\1\223\1\22" - + "\1\224\5\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\3\22\1\225\4\22\3\0\5\22" - + "\1\226\1\22\1\227\11\22\1\230\4\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\5\22\1\231\1\22\1\232\16\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22" - + "\1\233\3\0\6\22\1\234\11\22\1\235\5\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\11\22\1\236\4\22\1\237\7\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\1\22\1\240\1\241\7\22\1\242\13\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\2\22\1\243\3\22\1\244\17\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\7\22\1\245\3\0\26\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\7\22\1\246\16\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\2\22\1\247" - + "\23\22\14\0\1\22\33\0\1\250\52\0\1\251\40\0" - + "\1\252\53\0\1\253\37\0\1\254\113\0\1\255\61\0" - + "\1\102\2\0\30\102\1\0\12\102\1\0\45\102\2\0" - + "\1\104\111\0\1\256\3\0\27\256\1\257\1\260\1\256" - + "\1\261\1\256\1\262\5\256\1\263\1\256\1\264\1\265" - + "\5\256\1\266\1\267\1\256\1\270\30\256\1\0\1\107" - + "\2\0\31\107\1\0\11\107\1\0\45\107\2\0\1\111" - + "\113\0\1\113\114\0\1\114\7\0\1\114\116\0\1\271" - + "\105\0\2\272\3\0\1\272\1\0\4\272\2\0\4\272" - + "\1\0\1\273\2\0\10\272\3\0\26\272\16\0\1\274" - + "\2\0\30\274\1\275\60\274\10\0\2\276\3\0\1\276" - + "\1\0\4\276\2\0\4\276\1\0\1\277\2\0\10\276" - + "\3\0\26\276\34\0\1\300\75\0\1\301\2\0\30\301" - + "\1\302\1\303\57\301\31\0\1\304\64\0\1\133\126\0" - + "\1\305\102\0\1\306\3\0\1\307\3\0\1\310\2\0" - + "\2\307\2\0\1\311\1\0\4\307\5\0\3\307\2\0" - + "\2\307\3\0\26\307\2\0\1\312\13\0\1\137\2\0" - + "\43\137\2\0\44\137\1\313\3\0\32\313\1\314\1\313" - + "\1\262\5\313\1\263\1\313\1\264\1\265\5\313\1\266" - + "\1\267\1\313\1\315\27\313\1\316\1\0\1\142\1\317" - + "\1\320\111\142\5\321\1\322\106\321\11\0\1\323\123\0" - + "\1\150\13\0\1\150\3\0\2\150\2\164\57\0\2\152" - + "\3\0\1\152\1\0\4\152\2\0\4\152\4\0\10\152" - + "\3\0\26\152\50\0\1\324\113\0\1\325\77\0\1\326" - + "\13\0\1\327\76\0\1\330\3\0\1\331\13\0\1\331" - + "\3\0\2\331\2\0\1\330\100\0\1\332\72\0\1\150" - + "\7\0\1\166\13\0\1\166\3\0\2\166\2\164\60\0" - + "\1\150\7\0\1\166\13\0\1\167\3\0\1\171\1\172" - + "\2\164\67\0\2\333\3\0\3\333\5\0\1\334\2\0" - + "\5\333\3\0\1\333\1\0\1\333\1\0\1\333\6\0" - + "\1\333\41\0\1\150\7\0\1\166\13\0\1\172\3\0" - + "\2\172\2\164\60\0\1\150\7\0\1\166\13\0\1\335" - + "\3\0\2\335\2\164\55\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\14\22\1\336\11\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\1\22\1\337\24\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\7\22\1\340\16\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\7\22\1\341" - + "\16\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\10\22\1\342\15\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\4\22\1\343\21\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\5\22\1\344\20\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\7\22\1\345\3\0\26\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\10\22\1\346\15\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\5\22\1\347\2\22\1\350\15\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\7\22\1\351\16\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22" - + "\1\352\23\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\10\22\1\353\15\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\2\22\1\354\23\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\17\22\1\355\6\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\11\22" - + "\1\356\14\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\7\22\1\357\3\0\26\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\15\22\1\360\10\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\10\22\1\361\10\22\1\362\4\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\14\22\1\363\11\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\12\22\1\364" - + "\5\22\1\365\5\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\1\22\1\366" - + "\7\22\1\367\14\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\17\22\1\370" - + "\6\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\5\22\1\371\2\22\1\372" - + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\17\22\1\373\6\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\7\22\1\374\3\0\26\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\13\22" - + "\1\375\12\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\3\22\1\376\4\22\3\0\14\22" - + "\1\377\11\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\7\22\1\u0100\16\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\10\22\1\u0101\15\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\11\22\1\u0102\14\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\6\22" - + "\1\u0103\2\22\1\u0104\14\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\4\22" - + "\1\u0105\21\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\1\u0106\25\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\1\22\1\u0107\24\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\11\22\1\u0108\14\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\10\22\1\u0109" - + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\3\22\1\u010a\4\22\3\0\26\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\25\22\1\u010b\14\0\1\22\21\0\2\u010c" - + "\3\0\3\u010c\5\0\1\u010c\2\0\5\u010c\3\0\1\u010c" - + "\1\0\1\u010c\1\0\1\u010c\6\0\1\u010c\50\0\2\u010d" - + "\3\0\3\u010d\5\0\1\u010d\2\0\5\u010d\3\0\1\u010d" - + "\1\0\1\u010d\1\0\1\u010d\6\0\1\u010d\30\0\1\u010e" - + "\2\0\30\u010e\1\302\1\0\57\u010e\1\303\2\0\30\303" - + "\1\u010f\60\303\16\0\1\u0110\113\0\1\u0111\105\0\1\u0112" - + "\6\0\2\u0112\4\0\4\u0112\5\0\3\u0112\2\0\2\u0112" - + "\3\0\26\u0112\2\0\1\u0113\23\0\2\307\3\0\1\307" - + "\1\0\4\307\2\0\4\307\4\0\10\307\3\0\26\307" - + "\33\0\1\u0114\6\0\1\u0115\77\0\1\u0116\6\0\2\u0116" - + "\4\0\4\u0116\5\0\3\u0116\2\0\2\u0116\3\0\26\u0116" - + "\2\0\1\u0117\62\0\1\u0118\46\0\1\320\111\0\5\321" - + "\1\u0119\106\321\4\0\1\320\1\322\140\0\1\u011a\102\0" - + "\1\331\13\0\1\331\3\0\2\331\71\0\2\u011b\3\0" - + "\3\u011b\5\0\1\u011b\2\0\5\u011b\3\0\1\u011b\1\0" - + "\1\u011b\1\0\1\u011b\6\0\1\u011b\41\0\1\150\7\0" - + "\1\166\13\0\1\u011c\3\0\2\u011c\2\164\55\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\5\22" - + "\1\u011d\20\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\2\22\1\u011e\23\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\4\22\1\u011f\21\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22" - + "\1\u0120\3\0\26\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\16\22\1\u0121" - + "\7\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\7\22\1\u0122\3\0\26\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\2\22\1\u0123\23\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\12\22" - + "\1\u0124\13\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\7\22\1\u0125\3\0\26\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\4\22\1\u0126\21\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\5\22\1\u0127\2\22\1\u0128\15\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\5\22\1\u0129\20\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\10\22\1\u012a" - + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\7\22\1\u012b\3\0\26\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\10\22\1\u012c\15\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\1\22" - + "\1\u012d\24\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\11\22\1\u012e\14\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\7\22\1\u012f\3\0\26\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\14\22\1\u0130\11\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\7\22\1\u0131\3\0\26\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\6\22\1\u0132\17\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\5\22\1\u0133\20\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u0134\3\0" - + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\10\22\1\u0135\15\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\7\22\1\u0136\3\0\26\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\6\22" - + "\1\u0137\5\22\1\u0138\11\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u0139\3\0" - + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\2\22\1\u013a\23\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\7\22\1\u013b\3\0\26\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22" - + "\1\u013c\23\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\16\22\1\u013d\7\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\14\22\1\u013e\11\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\10\22\1\u013f\15\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\22\22" - + "\1\u0140\3\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\3\22\1\u0141\22\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\14\22\1\u0142\11\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\13\22\1\u0143\12\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\11\22" - + "\1\u0144\14\22\14\0\1\22\21\0\2\u0145\3\0\3\u0145" - + "\5\0\1\u0145\2\0\5\u0145\3\0\1\u0145\1\0\1\u0145" - + "\1\0\1\u0145\6\0\1\u0145\50\0\2\u0146\3\0\3\u0146" - + "\5\0\1\u0146\2\0\5\u0146\3\0\1\u0146\1\0\1\u0146" - + "\1\0\1\u0146\6\0\1\u0146\31\0\2\u0147\5\0\2\u0112" - + "\1\0\1\u0147\1\0\1\u0112\1\u0148\4\u0112\2\0\4\u0112" - + "\4\0\10\u0112\3\0\26\u0112\33\0\1\u0149\123\0\1\u014a" - + "\76\0\2\u0116\3\0\1\u0116\1\0\4\u0116\2\0\4\u0116" - + "\4\0\10\u0116\3\0\26\u0116\16\0\4\321\1\320\1\u0119" - + "\106\321\20\0\2\u014b\3\0\3\u014b\5\0\1\u014b\2\0" - + "\5\u014b\3\0\1\u014b\1\0\1\u014b\1\0\1\u014b\6\0" - + "\1\u014b\41\0\1\150\7\0\1\166\13\0\1\u014c\3\0" - + "\2\u014c\2\164\55\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\7\22\1\u014d\3\0\26\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\14\22\1\u014e\11\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\10\22\1\u014f" - + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\7\22\1\u0150\16\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\3\22\1\u0151\22\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\1\22\1\u0152\24\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\16\22\1\u0153" - + "\7\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\10\22\1\u0154\15\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\11\22\1\u0155\14\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\5\22\1\u0156\20\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\11\22\1\u0157" - + "\14\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\1\22\1\u0158\24\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\4\22\1\u0159\21\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\1\22\1\u015a\24\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\22\22\1\u015b" - + "\3\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\5\22\1\u015c\20\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\15\22\1\u015d\10\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\6\22\1\u015e\17\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\2\22\1\u015f" - + "\23\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\1\22\1\u0160\24\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\1\22\1\u0161\24\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\7\22\1\u0162" - + "\3\0\26\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\3\22\1\u0163\4\22\3\0\26\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\12\22\1\u0164\13\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\10\22\1\u0165\15\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\21\22" - + "\1\u0166\4\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\7\22\1\u0167\3\0\26\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\7\22\1\u0168\3\0\26\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22" - + "\1\u0169\23\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\2\22\1\u016a\23\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\11\22\1\u016b\14\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\7\22\1\u016c\16\22\14\0\1\22\2\0\2\u0147" - + "\10\0\1\u0147\2\0\1\u0148\123\0\1\u016d\105\0\2\u016e" - + "\3\0\3\u016e\5\0\1\u016e\2\0\5\u016e\3\0\1\u016e" - + "\1\0\1\u016e\1\0\1\u016e\6\0\1\u016e\41\0\1\150" - + "\7\0\1\166\13\0\1\u016f\3\0\2\u016f\2\164\55\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\14\22\1\u0170\11\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\11\22\1\u0171" - + "\14\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\13\22\1\u0172\12\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\7\22\1\u0173\16\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\7\22\1\u0174\16\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\4\22\1\u0175" - + "\21\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\16\22\1\u0176\7\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\11\22\1\u0177\14\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\7\22\1\u0178" - + "\3\0\26\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\17\22\1\u0179\6\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\3\22\1\u017a\4\22\3\0\26\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\7\22\1\u017b\16\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\3\22\1\u017c\4\22" - + "\3\0\7\22\1\u017d\16\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\10\22" - + "\1\u017e\15\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\21\22\1\u017f\4\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\11\22\1\u0180\14\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\14\22\1\u0181\11\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u0182\3\0" - + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\11\22\1\u0183\14\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\4\22\1\u0184\21\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\10\22\1\u0185\15\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\23\22\1\u0186" - + "\2\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\4\22\1\u0187\21\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\11\22\1\u0188\14\22\14\0\1\22\30\0" - + "\1\u0189\104\0\2\u018a\3\0\3\u018a\5\0\1\u018a\2\0" - + "\5\u018a\3\0\1\u018a\1\0\1\u018a\1\0\1\u018a\6\0" - + "\1\u018a\41\0\1\150\7\0\1\166\13\0\1\u018b\3\0" - + "\2\u018b\2\164\55\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\20\22\1\u018c\5\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\6\22\1\u018d\17\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\5\22" - + "\1\u018e\20\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\12\22\1\u018f\13\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\13\22\1\u0190\12\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\2\22\1\u0191\23\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\4\22" - + "\1\u0192\21\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\2\22\1\u0193\23\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\10\22\3\0\2\22\1\u0194\23\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22" - + "\1\u0195\3\0\26\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\7\22\1\u0196" - + "\16\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\10\22\1\u0197\15\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\4\22\1\u0198\21\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\10\22\1\u0199\15\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\7\22\1\u019a\3\0\26\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\7\22\1\u019b\3\0\26\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\10\22\1\u019c\15\22\14\0\1\22\31\0\1\u019d\103\0" - + "\2\u019e\3\0\3\u019e\5\0\1\u019e\2\0\5\u019e\3\0" - + "\1\u019e\1\0\1\u019e\1\0\1\u019e\6\0\1\u019e\41\0" - + "\1\150\7\0\1\166\13\0\1\u019f\3\0\2\u019f\2\164" - + "\55\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\7\22\1\u01a0\16\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u01a1\3\0" - + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\7\22\1\u01a2\3\0\26\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\4\22\1\u01a3\21\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u01a4\3\0" - + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\4\22\1\u01a5\21\22\14\0" - + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0" - + "\10\22\3\0\14\22\1\u01a6\11\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\7\22\1\u01a7\16\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\7\22\1\u01a8\3\0\26\22" - + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22" - + "\4\0\7\22\1\u01a9\3\0\26\22\14\0\1\22\7\0" - + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0" - + "\20\22\1\u01aa\5\22\14\0\1\22\30\0\1\u01ab\104\0" - + "\2\u01ac\3\0\3\u01ac\5\0\1\u01ac\2\0\5\u01ac\3\0" - + "\1\u01ac\1\0\1\u01ac\1\0\1\u01ac\6\0\1\u01ac\41\0" - + "\1\150\7\0\1\166\13\0\1\u01ad\3\0\2\u01ad\2\164" - + "\55\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22" - + "\1\u01ae\3\0\26\22\14\0\1\22\7\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\10\22\3\0\6\22\1\u01af" - + "\17\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\7\22\1\u01b0\3\0\26\22\14\0\1\22" - + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22" - + "\3\0\10\22\1\u01b1\15\22\14\0\1\22\7\0\3\22" - + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\13\22" - + "\1\u01b2\12\22\14\0\1\22\7\0\3\22\7\0\2\22" - + "\3\0\4\22\4\0\10\22\3\0\13\22\1\u01b3\12\22" - + "\14\0\1\22\25\0\1\u01b4\107\0\2\u01b5\3\0\3\u01b5" - + "\5\0\1\u01b5\2\0\5\u01b5\3\0\1\u01b5\1\0\1\u01b5" - + "\1\0\1\u01b5\6\0\1\u01b5\41\0\1\150\7\0\1\166" - + "\13\0\1\u01b6\3\0\2\u01b6\2\164\55\0\3\22\7\0" - + "\2\22\3\0\4\22\4\0\3\22\1\u01b7\4\22\3\0" - + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0" - + "\4\22\4\0\10\22\3\0\5\22\1\u01b8\20\22\14\0" - + "\1\22\12\0\1\150\7\0\1\166\13\0\1\u01b9\3\0" - + "\2\u01b9\2\164\60\0\1\150\7\0\1\166\13\0\1\u01ba" - + "\3\0\2\u01ba\2\164\60\0\1\150\7\0\1\166\13\0" - + "\1\u01bb\3\0\2\u01bb\2\164\60\0\1\150\7\0\1\166" - + "\13\0\1\u01bc\3\0\2\u01bc\2\164\60\0\1\150\7\0" - + "\1\166\13\0\1\u01bd\3\0\2\u01bd\2\164\60\0\1\150" - + "\7\0\1\166\13\0\1\u01be\3\0\2\u01be\2\164\47\0"; - - private static int[] zzUnpackTrans() { - int[] result = new int[22952]; - int offset = 0; - offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackTrans(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ - - int j = offset; /* index in unpacked array */ - - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - value--; - do { - result[j++] = value; - } while (--count > 0); - } - return j; - } - - - /* error codes */ - private static final int ZZ_UNKNOWN_ERROR = 0; - - private static final int ZZ_NO_MATCH = 1; - - private static final int ZZ_PUSHBACK_2BIG = 2; - - /* error messages for the codes above */ - private static final String ZZ_ERROR_MSG[] = { - "Unkown internal scanner error", - "Error: could not match input", - "Error: pushback value was too large" - }; - - /** - * ZZ_ATTRIBUTE[aState] contains the attributes of state aState - */ - private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute(); - - private static final String ZZ_ATTRIBUTE_PACKED_0 - = "\13\0\1\11\1\1\1\11\13\1\3\11\1\1\2\11" - + "\4\1\1\11\21\1\7\11\4\1\1\11\2\1\2\11" - + "\3\1\1\11\1\1\1\11\3\1\2\11\1\1\1\11" - + "\2\1\1\11\1\1\2\11\2\1\1\11\2\1\1\11" - + "\2\1\1\11\1\1\1\0\2\11\1\1\1\11\1\1" - + "\1\11\2\1\2\11\1\1\2\11\1\1\2\11\1\0" - + "\3\1\1\0\11\1\2\11\44\1\11\11\1\1\6\11" - + "\1\1\1\11\1\0\1\11\1\0\1\11\1\0\2\11" - + "\1\0\1\1\4\0\1\1\2\0\2\11\4\1\1\11" - + "\2\0\3\11\1\1\1\11\1\0\1\1\1\11\61\1" - + "\3\0\3\11\1\0\1\11\2\0\1\1\2\11\1\0" - + "\1\11\52\1\1\11\2\0\2\11\1\0\42\1\1\0" - + "\33\1\1\0\23\1\1\0\15\1\1\0\10\1\2\11" - + "\11\1"; - - private static int[] zzUnpackAttribute() { - int[] result = new int[446]; - int offset = 0; - offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); - return result; - } - - private static int zzUnpackAttribute(String packed, int offset, int[] result) { - int i = 0; /* index in packed string */ - - int j = offset; /* index in unpacked array */ - - int l = packed.length(); - while (i < l) { - int count = packed.charAt(i++); - int value = packed.charAt(i++); - do { - result[j++] = value; - } while (--count > 0); - } - return j; - } - - /** - * the input device - */ - private java.io.Reader zzReader; - - /** - * the current state of the DFA - */ - private int zzState; - - /** - * the current lexical state - */ - private int zzLexicalState = YYINITIAL; - - /** - * this buffer contains the current text to be matched and is - * the source of the yytext() string - */ - private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; - - /** - * the textposition at the last accepting state - */ - private int zzMarkedPos; - - /** - * the current text position in the buffer - */ - private int zzCurrentPos; - - /** - * startRead marks the beginning of the yytext() string in the buffer - */ - private int zzStartRead; - - /** - * endRead marks the last character in the buffer, that has been read - * from input - */ - private int zzEndRead; - - /** - * number of newlines encountered up to the start of the matched text - */ - private int yyline; - - /** - * the number of characters up to the start of the matched text - */ - private int yychar; - - /** - * the number of characters from the last newline up to the start of the - * matched text - */ - private int yycolumn; - - /** - * zzAtBOL == true <=> the scanner is currently at the beginning of a line - */ - private boolean zzAtBOL = true; - - /** - * zzAtEOF == true <=> the scanner is at the EOF - */ - private boolean zzAtEOF; - - /** - * denotes if the user-EOF-code has already been executed - */ - private boolean zzEOFDone; - - /** - * The number of occupied positions in zzBuffer beyond zzEndRead. - * When a lead/high surrogate has been read from the input stream - * into the final zzBuffer position, this will have a value of 1; - * otherwise, it will have a value of 0. - */ - private int zzFinalHighSurrogate = 0; - - /* user code: */ - private String sourceCode; - - public ActionScriptLexer(String sourceCode) { - this(new StringReader(sourceCode)); - this.sourceCode = sourceCode; - } - - public void yypushbackstr(String s, int state) { - sourceCode = s + sourceCode.substring(yychar + yylength()); - yyreset(new StringReader(sourceCode)); - yybegin(state); - } - - public void yypushbackstr(String s) { - yypushbackstr(s, YYINITIAL); - } - - StringBuffer string = new StringBuffer(); - - private static String xmlTagName = ""; - - public int yychar() { - return yychar; - } - - private Stack pushedBack = new Stack<>(); - - public int yyline() { - return yyline + 1; - } - - private List listeners = new ArrayList<>(); - - public void addListener(LexListener listener) { - listeners.add(listener); - } - - public void removeListener(LexListener listener) { - listeners.remove(listener); - } - - public void informListenersLex(ParsedSymbol s) { - for (LexListener l : listeners) { - l.onLex(s); - } - } - - public void informListenersPushBack(ParsedSymbol s) { - for (LexListener l : listeners) { - l.onPushBack(s); - } - } - - public void pushback(ParsedSymbol symb) { - pushedBack.push(symb); - last = null; - informListenersPushBack(symb); - } - - ParsedSymbol last; - - public ParsedSymbol lex() throws java.io.IOException, AVM2ParseException { - ParsedSymbol ret = null; - if (!pushedBack.isEmpty()) { - ret = last = pushedBack.pop(); - } else { - ret = last = yylex(); - } - informListenersLex(ret); - return ret; - } - - /** - * Creates a new scanner - * - * @param in the java.io.Reader to read input from. - */ - public ActionScriptLexer(java.io.Reader in) { - this.zzReader = in; - } - - /** - * Unpacks the compressed character translation table. - * - * @param packed the packed character translation table - * @return the unpacked character translation table - */ - private static char[] zzUnpackCMap(String packed) { - char[] map = new char[0x110000]; - int i = 0; /* index in packed string */ - - int j = 0; /* index in unpacked array */ - - while (i < 3140) { - int count = packed.charAt(i++); - char value = packed.charAt(i++); - do { - map[j++] = value; - } while (--count > 0); - } - return map; - } - - /** - * Refills the input buffer. - * - * @return false, iff there was new input. - * - * @exception java.io.IOException if any I/O-Error occurs - */ - private boolean zzRefill() throws java.io.IOException { - - /* first: make room (if you can) */ - if (zzStartRead > 0) { - zzEndRead += zzFinalHighSurrogate; - zzFinalHighSurrogate = 0; - System.arraycopy(zzBuffer, zzStartRead, - zzBuffer, 0, - zzEndRead - zzStartRead); - - /* translate stored positions */ - zzEndRead -= zzStartRead; - zzCurrentPos -= zzStartRead; - zzMarkedPos -= zzStartRead; - zzStartRead = 0; - } - - /* is the buffer big enough? */ - if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate) { - /* if not: blow it up */ - char newBuffer[] = new char[zzBuffer.length * 2]; - System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); - zzBuffer = newBuffer; - zzEndRead += zzFinalHighSurrogate; - zzFinalHighSurrogate = 0; - } - - /* fill the buffer with new input */ - int requested = zzBuffer.length - zzEndRead; - int totalRead = 0; - while (totalRead < requested) { - int numRead = zzReader.read(zzBuffer, zzEndRead + totalRead, requested - totalRead); - if (numRead == -1) { - break; - } - totalRead += numRead; - } - - if (totalRead > 0) { - zzEndRead += totalRead; - if (totalRead == requested) { /* possibly more input available */ - - if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) { - --zzEndRead; - zzFinalHighSurrogate = 1; - } - } - return false; - } - - // totalRead = 0: End of stream - return true; - } - - /** - * Closes the input stream. - */ - public final void yyclose() throws java.io.IOException { - zzAtEOF = true; /* indicate end of file */ - - zzEndRead = zzStartRead; /* invalidate buffer */ - - if (zzReader != null) { - zzReader.close(); - } - } - - /** - * 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. - * - * Internal scan buffer is resized down to its initial length, if it has - * grown. - * - * @param reader the new input stream - */ - public final void yyreset(java.io.Reader reader) { - zzReader = reader; - zzAtBOL = true; - zzAtEOF = false; - zzEOFDone = false; - zzEndRead = zzStartRead = 0; - zzCurrentPos = zzMarkedPos = 0; - zzFinalHighSurrogate = 0; - yyline = yychar = yycolumn = 0; - zzLexicalState = YYINITIAL; - if (zzBuffer.length > ZZ_BUFFERSIZE) { - zzBuffer = new char[ZZ_BUFFERSIZE]; - } - } - - /** - * Returns the current lexical state. - */ - public final int yystate() { - return zzLexicalState; - } - - /** - * Enters a new lexical state - * - * @param newState the new lexical state - */ - public final void yybegin(int newState) { - zzLexicalState = newState; - } - - /** - * Returns the text matched by the current regular expression. - */ - public final String yytext() { - return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead); - } - - /** - * Returns the character at position pos from the - * matched text. - * - * It is equivalent to yytext().charAt(pos), but faster - * - * @param pos the position of the character to fetch. - * A value from 0 to yylength()-1. - * - * @return the character at position pos - */ - public final char yycharat(int pos) { - return zzBuffer[zzStartRead + pos]; - } - - /** - * Returns the length of the matched text region. - */ - public final int yylength() { - return zzMarkedPos - zzStartRead; - } - - /** - * Reports an error that occured while scanning. - * - * In a wellformed scanner (no or only correct usage of - * yypushback(int) and a match-all fallback rule) this method - * will only be called with things that "Can't Possibly Happen". - * If this method is called, something is seriously wrong - * (e.g. a JFlex bug producing a faulty scanner etc.). - * - * Usual syntax/scanner level error handling should be done - * in error fallback rules. - * - * @param errorCode the code of the errormessage to display - */ - private void zzScanError(int errorCode) { - String message; - try { - message = ZZ_ERROR_MSG[errorCode]; - } catch (ArrayIndexOutOfBoundsException e) { - message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; - } - - throw new Error(message); - } - - /** - * Pushes the specified amount of characters back into the input stream. - * - * They will be read again by then next call of the scanning method - * - * @param number the number of characters to be read again. - * This number must not be greater than yylength()! - */ - public void yypushback(int number) { - if (number > yylength()) { - zzScanError(ZZ_PUSHBACK_2BIG); - } - - zzMarkedPos -= number; - } - - /** - * Resumes scanning until the next regular expression is matched, - * the end of input is encountered or an I/O-Error occurs. - * - * @return the next token - * @exception java.io.IOException if any I/O-Error occurs - */ - public ParsedSymbol yylex() throws java.io.IOException, AVM2ParseException { - int zzInput; - int zzAction; - - // cached fields: - int zzCurrentPosL; - int zzMarkedPosL; - int zzEndReadL = zzEndRead; - char[] zzBufferL = zzBuffer; - char[] zzCMapL = ZZ_CMAP; - - int[] zzTransL = ZZ_TRANS; - int[] zzRowMapL = ZZ_ROWMAP; - int[] zzAttrL = ZZ_ATTRIBUTE; - - while (true) { - zzMarkedPosL = zzMarkedPos; - - yychar += zzMarkedPosL - zzStartRead; - - zzAction = -1; - - zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - - zzState = ZZ_LEXSTATE[zzLexicalState]; - - // set up zzAction for empty match case: - int zzAttributes = zzAttrL[zzState]; - if ((zzAttributes & 1) == 1) { - zzAction = zzState; - } - - zzForAction: - { - while (true) { - - if (zzCurrentPosL < zzEndReadL) { - zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); - zzCurrentPosL += Character.charCount(zzInput); - } else if (zzAtEOF) { - zzInput = YYEOF; - break zzForAction; - } else { - // store back cached positions - zzCurrentPos = zzCurrentPosL; - zzMarkedPos = zzMarkedPosL; - boolean eof = zzRefill(); - // get translated positions and possibly new buffer - zzCurrentPosL = zzCurrentPos; - zzMarkedPosL = zzMarkedPos; - zzBufferL = zzBuffer; - zzEndReadL = zzEndRead; - if (eof) { - zzInput = YYEOF; - break zzForAction; - } else { - zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); - zzCurrentPosL += Character.charCount(zzInput); - } - } - int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]]; - if (zzNext == -1) { - break zzForAction; - } - zzState = zzNext; - - zzAttributes = zzAttrL[zzState]; - if ((zzAttributes & 1) == 1) { - zzAction = zzState; - zzMarkedPosL = zzCurrentPosL; - if ((zzAttributes & 8) == 8) { - break zzForAction; - } - } - - } - } - - // store back cached position - zzMarkedPos = zzMarkedPosL; - - switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 1: { - } - case 164: - break; - case 2: { - yyline++; - } - case 165: - break; - case 3: { /*ignore*/ - - } - case 166: - break; - case 4: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); - } - case 167: - break; - case 5: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); - } - case 168: - break; - case 6: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - } - case 169: - break; - case 7: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); - } - case 170: - break; - case 8: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); - } - case 171: - break; - case 9: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); - } - case 172: - break; - case 10: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); - } - case 173: - break; - case 11: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); - } - case 174: - break; - case 12: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); - } - case 175: - break; - case 13: { - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); - } - case 176: - break; - case 14: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); - } - case 177: - break; - case 15: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); - } - case 178: - break; - case 16: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); - } - case 179: - break; - case 17: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); - } - case 180: - break; - case 18: { - string.setLength(0); - yybegin(STRING); - } - case 181: - break; - case 19: { - string.setLength(0); - yybegin(CHARLITERAL); - } - case 182: - break; - case 20: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); - } - case 183: - break; - case 21: { - string.setLength(0); - yybegin(OIDENTIFIER); - } - case 184: - break; - case 22: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); - } - case 185: - break; - case 23: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); - } - case 186: - break; - case 24: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); - } - case 187: - break; - case 25: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); - } - case 188: - break; - case 26: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); - } - case 189: - break; - case 27: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); - } - case 190: - break; - case 28: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); - } - case 191: - break; - case 29: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); - } - case 192: - break; - case 30: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); - } - case 193: - break; - case 31: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); - } - case 194: - break; - case 32: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); - } - case 195: - break; - case 33: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); - } - case 196: - break; - case 34: { - string.append(yytext()); - } - case 197: - break; - case 35: { - yybegin(YYINITIAL); - yyline++; - } - case 198: - break; - case 36: { - yybegin(YYINITIAL); - // length also includes the trailing quote - return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); - } - case 199: - break; - case 37: { - yybegin(YYINITIAL); - yyline++; - } - case 200: - break; - case 38: { - string.append(yytext()); - yyline++; - } - case 201: - break; - case 39: { - yybegin(XML); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_END, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 202: - break; - case 40: { - yybegin(YYINITIAL); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRNAMEVAR_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 203: - break; - case 41: { - yybegin(YYINITIAL); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRVALVAR_BEGIN, yytext()); - } - case 204: - break; - case 42: { - yybegin(YYINITIAL); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRNAMEVAR_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 205: - break; - case 43: { - yybegin(YYINITIAL); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRVALVAR_BEGIN, yytext()); - } - case 206: - break; - case 44: { - string.append(yytext()); - yyline++; - } - case 207: - break; - case 45: { - yybegin(YYINITIAL); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_VAR_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 208: - break; - case 46: { - yybegin(YYINITIAL); - // length also includes the trailing quote - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); - } - case 209: - break; - case 47: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); - } - case 210: - break; - case 48: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); - } - case 211: - break; - case 49: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DESCENDANTS, yytext()); - } - case 212: - break; - case 50: { - return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, yytext()); - } - case 213: - break; - case 51: { - return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); - } - case 214: - break; - case 52: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FILTER, yytext()); - } - case 215: - break; - case 53: { - yybegin(XMLOPENTAG); - string.setLength(0); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_BEGIN, yytext()); - } - case 216: - break; - case 54: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); - } - case 217: - break; - case 55: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); - } - case 218: - break; - case 56: { - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTVARTAG_BEGIN, yytext()); - } - case 219: - break; - case 57: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); - } - case 220: - break; - case 58: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); - } - case 221: - break; - case 59: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); - } - case 222: - break; - case 60: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); - } - case 223: - break; - case 61: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); - } - case 224: - break; - case 62: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); - } - case 225: - break; - case 63: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); - } - case 226: - break; - case 64: { - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); - } - case 227: - break; - case 65: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); - } - case 228: - break; - case 66: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); - } - case 229: - break; - case 67: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); - } - case 230: - break; - case 68: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IF, yytext()); - } - case 231: - break; - case 69: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); - } - case 232: - break; - case 70: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IN, yytext()); - } - case 233: - break; - case 71: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DO, yytext()); - } - case 234: - break; - case 72: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); - } - case 235: - break; - case 73: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); - } - case 236: - break; - case 74: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); - } - case 237: - break; - case 75: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); - } - case 238: - break; - case 76: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); - } - case 239: - break; - case 77: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); - } - case 240: - break; - case 78: { /* ignore illegal character escape */ - - } - case 241: - break; - case 79: { - string.append('\"'); - } - case 242: - break; - case 80: { - string.append('\''); - } - case 243: - break; - case 81: { - string.append('\f'); - } - case 244: - break; - case 82: { - string.append('\\'); - } - case 245: - break; - case 83: { - string.append('\b'); - } - case 246: - break; - case 84: { - string.append('\r'); - } - case 247: - break; - case 85: { - string.append('\n'); - } - case 248: - break; - case 86: { - string.append('\t'); - } - case 249: - break; - case 87: { - yybegin(XML); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTFINISHTAG_END, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 250: - break; - case 88: { - yybegin(XMLOPENTAGATTRIB); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTENAME, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 251: - break; - case 89: { - yybegin(XMLOPENTAG); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext()); - } - case 252: - break; - case 90: { - yybegin(XMLINSTRATTRIB); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTENAME, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 253: - break; - case 91: { - yybegin(XML); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTR_END, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 254: - break; - case 92: { - yybegin(XMLINSTROPENTAG); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext()); - } - case 255: - break; - case 93: { - yybegin(XMLOPENTAG); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 256: - break; - case 94: { - yybegin(YYINITIAL); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTVARTAG_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 257: - break; - case 95: { - throw new AVM2ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); - } - case 258: - break; - case 96: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); - } - case 259: - break; - case 97: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); - } - case 260: - break; - case 98: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); - } - case 261: - break; - case 99: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); - } - case 262: - break; - case 100: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); - } - case 263: - break; - case 101: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); - } - case 264: - break; - case 102: { - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); - } - case 265: - break; - case 103: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); - } - case 266: - break; - case 104: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.SET, yytext()); - } - case 267: - break; - case 105: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); - } - case 268: - break; - case 106: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); - } - case 269: - break; - case 107: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.USE, yytext()); - } - case 270: - break; - case 108: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); - } - case 271: - break; - case 109: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.GET, yytext()); - } - case 272: - break; - case 110: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NAN, yytext()); - } - case 273: - break; - case 111: { - string.append(yytext()); - yybegin(XML); - String ret = string.toString(); - string.setLength(0); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_CDATA, ret); - } - case 274: - break; - case 112: { - string.append(yytext()); - yybegin(XML); - String ret = string.toString(); - string.setLength(0); - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_COMMENT, ret); - } - case 275: - break; - case 113: { - yybegin(YYINITIAL); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_FINISHVARTAG_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 276: - break; - case 114: { - yybegin(XMLINSTROPENTAG); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTR_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 277: - break; - case 115: { - yybegin(YYINITIAL); - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRVARTAG_BEGIN, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 278: - break; - case 116: { - string.append('\u00A7'); - } - case 279: - break; - case 117: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); - } - case 280: - break; - case 118: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.EACH, yytext()); - } - case 281: - break; - case 119: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); - } - case 282: - break; - case 120: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); - } - case 283: - break; - case 121: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); - } - case 284: - break; - case 122: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); - } - case 285: - break; - case 123: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); - } - case 286: - break; - case 124: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); - } - case 287: - break; - case 125: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); - } - case 288: - break; - case 126: { - char val = (char) Integer.parseInt(yytext().substring(2), 16); - string.append(val); - } - case 289: - break; - case 127: { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_FINISHTAG, yytext())); - if (string.length() > 0) { - pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); - string.setLength(0); - } - return lex(); - } - case 290: - break; - case 128: { - String ret = string.toString(); - string.setLength(0); - string.append(yytext()); - yybegin(XMLCOMMENT); - if (!ret.isEmpty()) { - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, ret); - } - } - case 291: - break; - case 129: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); - } - case 292: - break; - case 130: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.FINAL, yytext()); - } - case 293: - break; - case 131: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); - } - case 294: - break; - case 132: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); - } - case 295: - break; - case 133: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONST, yytext()); - } - case 296: - break; - case 134: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); - } - case 297: - break; - case 135: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); - } - case 298: - break; - case 136: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); - } - case 299: - break; - case 137: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); - } - case 300: - break; - case 138: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); - } - case 301: - break; - case 139: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.STATIC, yytext()); - } - case 302: - break; - case 140: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); - } - case 303: - break; - case 141: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.NATIVE, yytext()); - } - case 304: - break; - case 142: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); - } - case 305: - break; - case 143: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); - } - case 306: - break; - case 144: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); - } - case 307: - break; - case 145: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); - } - case 308: - break; - case 146: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); - } - case 309: - break; - case 147: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); - } - case 310: - break; - case 148: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); - } - case 311: - break; - case 149: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.DYNAMIC, yytext()); - } - case 312: - break; - case 150: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); - } - case 313: - break; - case 151: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PACKAGE, yytext()); - } - case 314: - break; - case 152: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); - } - case 315: - break; - case 153: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); - } - case 316: - break; - case 154: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.OVERRIDE, yytext()); - } - case 317: - break; - case 155: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERNAL, yytext()); - } - case 318: - break; - case 156: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.INFINITY, yytext()); - } - case 319: - break; - case 157: { - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.NAMESPACE, yytext()); - } - case 320: - break; - case 158: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); - } - case 321: - break; - case 159: { - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); - } - case 322: - break; - case 160: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PROTECTED, yytext()); - } - case 323: - break; - case 161: { - String ret = string.toString(); - string.setLength(0); - string.append(yytext()); - yybegin(XMLCDATA); - if (!ret.isEmpty()) { - return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, ret); - } - } - case 324: - break; - case 162: { - return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); - } - case 325: - break; - case 163: { - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); - } - case 326: - break; - default: - if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { - zzAtEOF = true; - { - return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); - } - } else { - zzScanError(ZZ_NO_MATCH); - } - } - } - } -} +/* The following code was generated by JFlex 1.6.0 */ + +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + + +/** + * This class is a scanner generated by + * JFlex 1.6.0 + * from the specification file D:/Dropbox/Programovani/JavaSE/FFDec/libsrc/ffdec_lib/lexers/actionscript3_script.flex + */ +public final class ActionScriptLexer { + + /** This character denotes the end of file */ + public static final int YYEOF = -1; + + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int YYINITIAL = 0; + public static final int STRING = 2; + public static final int CHARLITERAL = 4; + public static final int XMLOPENTAG = 6; + public static final int XMLOPENTAGATTRIB = 8; + public static final int XMLINSTROPENTAG = 10; + public static final int XMLINSTRATTRIB = 12; + public static final int XMLCDATA = 14; + public static final int XMLCOMMENT = 16; + public static final int XML = 18; + public static final int OIDENTIFIER = 20; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, + 8, 8, 9, 9, 10, 10 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\13\1\2\1\113\1\3\1\1\22\0\1\13\1\14\1\33"+ + "\1\0\1\6\1\110\1\105\1\34\1\76\1\77\1\5\1\45\1\103"+ + "\1\15\1\11\1\4\1\35\3\41\4\42\2\21\1\17\1\102\1\12"+ + "\1\32\1\16\1\23\1\111\1\27\1\20\1\25\1\26\1\43\1\20"+ + "\2\10\1\74\4\10\1\75\5\10\1\30\3\10\1\37\2\10\1\24"+ + "\1\46\1\31\1\107\1\10\1\0\1\52\1\50\1\54\1\63\1\44"+ + "\1\40\1\73\1\66\1\61\1\10\1\53\1\64\1\71\1\57\1\56"+ + "\1\67\1\10\1\51\1\55\1\60\1\62\1\72\1\65\1\36\1\70"+ + "\1\10\1\100\1\106\1\101\1\104\6\0\1\113\41\0\1\47\2\0"+ + "\1\6\12\0\1\6\1\0\1\22\2\0\1\6\5\0\2\6\1\112"+ + "\24\6\1\0\37\6\1\0\u01ca\6\4\0\14\6\16\0\5\6\7\0"+ + "\1\6\1\0\1\6\21\0\160\7\5\6\1\0\2\6\2\0\4\6"+ + "\1\0\1\6\6\0\1\6\1\0\3\6\1\0\1\6\1\0\24\6"+ + "\1\0\123\6\1\0\213\6\1\0\5\7\2\0\246\6\1\0\46\6"+ + "\2\0\1\6\7\0\47\6\11\0\55\7\1\0\1\7\1\0\2\7"+ + "\1\0\2\7\1\0\1\7\10\0\33\6\5\0\3\6\35\0\13\7"+ + "\5\0\53\6\37\7\4\0\2\6\1\7\143\6\1\0\1\6\7\7"+ + "\2\0\6\7\2\6\2\7\1\0\4\7\2\6\12\7\3\6\2\0"+ + "\1\6\20\0\1\6\1\7\36\6\33\7\2\0\131\6\13\7\1\6"+ + "\16\0\12\7\41\6\11\7\2\6\4\0\1\6\5\0\26\6\4\7"+ + "\1\6\11\7\1\6\3\7\1\6\5\7\22\0\31\6\3\7\104\0"+ + "\23\6\61\0\40\7\66\6\3\7\1\6\22\7\1\6\7\7\12\6"+ + "\2\7\2\0\12\7\1\0\20\6\3\7\1\0\10\6\2\0\2\6"+ + "\2\0\26\6\1\0\7\6\1\0\1\6\3\0\4\6\2\0\1\7"+ + "\1\6\7\7\2\0\2\7\2\0\3\7\1\6\10\0\1\7\4\0"+ + "\2\6\1\0\3\6\2\7\2\0\12\7\2\6\17\0\3\7\1\0"+ + "\6\6\4\0\2\6\2\0\26\6\1\0\7\6\1\0\2\6\1\0"+ + "\2\6\1\0\2\6\2\0\1\7\1\0\5\7\4\0\2\7\2\0"+ + "\3\7\3\0\1\7\7\0\4\6\1\0\1\6\7\0\14\7\3\6"+ + "\1\7\13\0\3\7\1\0\11\6\1\0\3\6\1\0\26\6\1\0"+ + "\7\6\1\0\2\6\1\0\5\6\2\0\1\7\1\6\10\7\1\0"+ + "\3\7\1\0\3\7\2\0\1\6\17\0\2\6\2\7\2\0\12\7"+ + "\21\0\3\7\1\0\10\6\2\0\2\6\2\0\26\6\1\0\7\6"+ + "\1\0\2\6\1\0\5\6\2\0\1\7\1\6\7\7\2\0\2\7"+ + "\2\0\3\7\10\0\2\7\4\0\2\6\1\0\3\6\2\7\2\0"+ + "\12\7\1\0\1\6\20\0\1\7\1\6\1\0\6\6\3\0\3\6"+ + "\1\0\4\6\3\0\2\6\1\0\1\6\1\0\2\6\3\0\2\6"+ + "\3\0\3\6\3\0\14\6\4\0\5\7\3\0\3\7\1\0\4\7"+ + "\2\0\1\6\6\0\1\7\16\0\12\7\20\0\4\7\1\0\10\6"+ + "\1\0\3\6\1\0\27\6\1\0\20\6\3\0\1\6\7\7\1\0"+ + "\3\7\1\0\4\7\7\0\2\7\1\0\2\6\6\0\2\6\2\7"+ + "\2\0\12\7\21\0\3\7\1\0\10\6\1\0\3\6\1\0\27\6"+ + "\1\0\12\6\1\0\5\6\2\0\1\7\1\6\7\7\1\0\3\7"+ + "\1\0\4\7\7\0\2\7\7\0\1\6\1\0\2\6\2\7\2\0"+ + "\12\7\1\0\2\6\16\0\3\7\1\0\10\6\1\0\3\6\1\0"+ + "\51\6\2\0\1\6\7\7\1\0\3\7\1\0\4\7\1\6\10\0"+ + "\1\7\10\0\2\6\2\7\2\0\12\7\12\0\6\6\2\0\2\7"+ + "\1\0\22\6\3\0\30\6\1\0\11\6\1\0\1\6\2\0\7\6"+ + "\3\0\1\7\4\0\6\7\1\0\1\7\1\0\10\7\6\0\12\7"+ + "\2\0\2\7\15\0\60\6\1\7\2\6\7\7\5\0\7\6\10\7"+ + "\1\0\12\7\47\0\2\6\1\0\1\6\2\0\2\6\1\0\1\6"+ + "\2\0\1\6\6\0\4\6\1\0\7\6\1\0\3\6\1\0\1\6"+ + "\1\0\1\6\2\0\2\6\1\0\4\6\1\7\2\6\6\7\1\0"+ + "\2\7\1\6\2\0\5\6\1\0\1\6\1\0\6\7\2\0\12\7"+ + "\2\0\4\6\40\0\1\6\27\0\2\7\6\0\12\7\13\0\1\7"+ + "\1\0\1\7\1\0\1\7\4\0\2\7\10\6\1\0\44\6\4\0"+ + "\24\7\1\0\2\7\5\6\13\7\1\0\44\7\11\0\1\7\71\0"+ + "\53\6\24\7\1\6\12\7\6\0\6\6\4\7\4\6\3\7\1\6"+ + "\3\7\2\6\7\7\3\6\4\7\15\6\14\7\1\6\17\7\2\0"+ + "\46\6\1\0\1\6\5\0\1\6\2\0\53\6\1\0\u014d\6\1\0"+ + "\4\6\2\0\7\6\1\0\1\6\1\0\4\6\2\0\51\6\1\0"+ + "\4\6\2\0\41\6\1\0\4\6\2\0\7\6\1\0\1\6\1\0"+ + "\4\6\2\0\17\6\1\0\71\6\1\0\4\6\2\0\103\6\2\0"+ + "\3\7\40\0\20\6\20\0\125\6\14\0\u026c\6\2\0\21\6\1\0"+ + "\32\6\5\0\113\6\3\0\3\7\10\6\7\0\15\6\1\0\4\6"+ + "\3\7\13\0\22\6\3\7\13\0\22\6\2\7\14\0\15\6\1\0"+ + "\3\6\1\0\2\7\14\0\64\6\40\7\3\0\1\6\4\0\1\6"+ + "\1\7\2\0\12\7\41\0\3\7\2\0\12\7\6\0\130\6\10\0"+ + "\51\6\1\7\1\6\5\0\106\6\12\0\37\6\1\0\14\7\4\0"+ + "\14\7\12\0\12\7\36\6\2\0\5\6\13\0\54\6\4\0\21\7"+ + "\7\6\2\7\6\0\12\7\46\0\27\6\5\7\4\0\65\6\12\7"+ + "\1\0\35\7\2\0\13\7\6\0\12\7\15\0\1\6\10\0\16\7"+ + "\102\0\5\7\57\6\21\7\7\6\4\0\12\7\21\0\11\7\14\0"+ + "\3\7\36\6\15\7\2\6\12\7\54\6\16\7\14\0\44\6\24\7"+ + "\10\0\12\7\3\0\3\6\12\7\44\6\122\0\3\7\1\0\25\7"+ + "\4\6\1\7\4\6\3\7\2\6\1\0\2\7\6\0\300\6\66\7"+ + "\6\0\4\7\u0116\6\2\0\6\6\2\0\46\6\2\0\6\6\2\0"+ + "\10\6\1\0\1\6\1\0\1\6\1\0\1\6\1\0\37\6\2\0"+ + "\65\6\1\0\7\6\1\0\1\6\3\0\3\6\1\0\7\6\3\0"+ + "\4\6\2\0\6\6\4\0\15\6\5\0\3\6\1\0\7\6\3\0"+ + "\14\0\2\0\32\0\1\113\1\113\25\0\2\7\23\0\1\7\33\0"+ + "\1\0\1\6\15\0\1\6\20\0\15\6\63\0\15\7\4\0\1\7"+ + "\3\0\14\7\21\0\1\6\4\0\1\6\2\0\12\6\1\0\1\6"+ + "\3\0\5\6\6\0\1\6\1\0\1\6\1\0\1\6\1\0\4\6"+ + "\1\0\13\6\2\0\4\6\5\0\5\6\4\0\1\6\21\0\43\7"+ + "\2\6\4\7\7\0\u0a70\0\57\6\1\0\57\6\1\0\205\6\6\0"+ + "\4\6\3\7\2\6\14\0\46\6\1\0\1\6\5\0\1\6\2\0"+ + "\70\6\7\0\1\6\17\0\1\7\27\6\11\0\7\6\1\0\7\6"+ + "\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6"+ + "\1\0\7\6\1\0\40\7\57\0\1\6\u01c0\0\21\0\4\0\2\6"+ + "\1\7\31\0\17\7\1\0\5\6\2\0\3\7\2\6\4\0\126\6"+ + "\2\0\2\7\2\0\3\6\1\0\132\6\1\0\4\6\5\0\51\6"+ + "\3\0\136\6\21\0\33\6\65\0\20\6\u0200\0\u19b6\6\112\0\u51cd\6"+ + "\63\0\u048d\6\103\0\56\6\2\0\u010d\6\3\0\20\6\12\7\2\6"+ + "\24\0\57\6\1\7\4\0\12\7\1\0\37\6\1\0\1\7\106\6"+ + "\14\7\45\0\11\6\2\0\147\6\2\0\4\6\1\0\36\6\2\0"+ + "\2\6\105\0\13\6\1\7\3\6\1\7\4\6\1\7\27\6\5\7"+ + "\30\0\64\6\14\0\2\7\62\6\21\7\13\0\12\7\6\0\22\7"+ + "\6\6\3\0\1\6\4\0\12\7\34\6\10\7\2\0\27\6\15\7"+ + "\14\0\35\6\3\0\4\7\57\6\16\7\16\0\1\6\12\7\6\0"+ + "\5\6\1\7\12\6\12\7\5\6\1\0\51\6\16\7\11\0\3\6"+ + "\1\7\10\6\2\7\2\0\12\7\6\0\27\6\3\0\1\6\3\7"+ + "\62\6\1\7\1\6\3\7\2\6\2\7\5\6\2\7\1\6\1\7"+ + "\1\6\30\0\3\6\2\0\13\6\5\7\2\0\3\6\2\7\12\0"+ + "\6\6\2\0\6\6\2\0\6\6\11\0\7\6\1\0\7\6\1\0"+ + "\53\6\1\0\4\6\4\0\2\6\132\0\43\6\10\7\1\0\2\7"+ + "\2\0\12\7\6\0\u2ba4\6\14\0\27\6\4\0\61\6\4\0\u1800\0"+ + "\u0900\0\u016e\6\2\0\152\6\46\0\7\6\14\0\5\6\5\0\1\6"+ + "\1\7\12\6\1\0\15\6\1\0\5\6\1\0\1\6\1\0\2\6"+ + "\1\0\2\6\1\0\154\6\41\0\u016b\6\22\0\100\6\2\0\66\6"+ + "\10\0\40\0\14\6\4\0\20\7\20\0\16\7\5\0\2\7\30\0"+ + "\3\7\40\0\5\6\1\0\207\6\23\0\12\7\7\0\32\6\4\0"+ + "\1\7\1\0\32\6\13\0\131\6\3\0\6\6\2\0\6\6\2\0"+ + "\6\6\2\0\3\6\41\0\2\0\14\6\1\0\32\6\1\0\23\6"+ + "\1\0\2\6\1\0\17\6\2\0\16\6\42\0\173\6\105\0\65\7"+ + "\210\0\1\7\202\0\35\6\3\0\61\6\17\0\1\7\37\0\40\6"+ + "\20\0\21\6\1\7\10\6\1\7\5\0\46\6\5\7\5\0\36\6"+ + "\2\0\44\6\4\0\10\6\1\0\5\7\52\0\236\6\2\0\12\7"+ + "\126\0\50\6\10\0\64\6\234\0\u0137\6\11\0\26\6\12\0\10\6"+ + "\230\0\6\6\2\0\1\6\1\0\54\6\1\0\2\6\3\0\1\6"+ + "\2\0\27\6\12\0\27\6\11\0\37\6\141\0\26\6\12\0\32\6"+ + "\106\0\70\6\6\0\2\6\100\0\1\6\3\7\1\0\2\7\5\0"+ + "\4\7\4\6\1\0\3\6\1\0\33\6\4\0\3\7\4\0\1\7"+ + "\40\0\35\6\3\0\35\6\43\0\10\6\1\0\34\6\2\7\31\0"+ + "\66\6\12\0\26\6\12\0\23\6\15\0\22\6\156\0\111\6\u03b7\0"+ + "\3\7\65\6\17\7\37\0\12\7\17\0\4\7\55\6\13\7\25\0"+ + "\31\6\7\0\12\7\6\0\3\7\44\6\16\7\1\0\12\7\20\0"+ + "\43\6\1\7\2\0\1\6\11\0\3\7\60\6\16\7\4\6\13\0"+ + "\12\7\1\6\45\0\22\6\1\0\31\6\14\7\170\0\57\6\14\7"+ + "\5\0\12\7\7\0\3\7\1\0\10\6\2\0\2\6\2\0\26\6"+ + "\1\0\7\6\1\0\2\6\1\0\5\6\2\0\1\7\1\6\7\7"+ + "\2\0\2\7\2\0\3\7\11\0\1\7\5\0\5\6\2\7\2\0"+ + "\7\7\3\0\5\7\u010b\0\60\6\24\7\2\6\1\0\1\6\10\0"+ + "\12\7\246\0\57\6\7\7\2\0\11\7\77\0\60\6\21\7\3\0"+ + "\1\6\13\0\12\7\46\0\53\6\15\7\10\0\12\7\u01d6\0\100\6"+ + "\12\7\25\0\1\6\u01c0\0\71\6\u0507\0\u0399\6\147\0\157\7\u0b91\0"+ + "\u042f\6\u33d1\0\u0239\6\7\0\37\6\1\0\12\7\146\0\36\6\2\0"+ + "\5\7\13\0\60\6\7\7\11\0\4\6\14\0\12\7\11\0\25\6"+ + "\5\0\23\6\u0370\0\105\6\13\0\1\6\56\7\20\0\4\7\15\6"+ + "\u4060\0\2\6\u0bfe\0\153\6\5\0\15\6\3\0\11\6\7\0\12\6"+ + "\3\0\2\7\u14c6\0\5\7\3\0\6\7\10\0\10\7\2\0\7\7"+ + "\36\0\4\7\224\0\3\7\u01bb\0\125\6\1\0\107\6\1\0\2\6"+ + "\2\0\1\6\2\0\2\6\2\0\4\6\1\0\14\6\1\0\1\6"+ + "\1\0\7\6\1\0\101\6\1\0\4\6\2\0\10\6\1\0\7\6"+ + "\1\0\34\6\1\0\4\6\1\0\5\6\1\0\1\6\3\0\7\6"+ + "\1\0\u0154\6\2\0\31\6\1\0\31\6\1\0\37\6\1\0\31\6"+ + "\1\0\37\6\1\0\31\6\1\0\37\6\1\0\31\6\1\0\37\6"+ + "\1\0\31\6\1\0\10\6\2\0\62\7\u1000\0\305\6\13\0\7\7"+ + "\u0529\0\4\6\1\0\33\6\1\0\2\6\1\0\1\6\2\0\1\6"+ + "\1\0\12\6\1\0\4\6\1\0\1\6\1\0\1\6\6\0\1\6"+ + "\4\0\1\6\1\0\1\6\1\0\1\6\1\0\3\6\1\0\2\6"+ + "\1\0\1\6\2\0\1\6\1\0\1\6\1\0\1\6\1\0\1\6"+ + "\1\0\1\6\1\0\2\6\1\0\1\6\2\0\4\6\1\0\7\6"+ + "\1\0\4\6\1\0\4\6\1\0\1\6\1\0\12\6\1\0\21\6"+ + "\5\0\3\6\1\0\5\6\1\0\21\6\u1144\0\ua6d7\6\51\0\u1035\6"+ + "\13\0\336\6\u3fe2\0\u021e\6\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\u06ed\0"+ + "\360\7\uffff\0\uffff\0\ufe12\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\13\0\1\1\2\2\1\3\1\4\1\5\1\6\1\7"+ + "\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17"+ + "\1\20\1\21\1\22\1\23\1\15\2\6\1\24\1\25"+ + "\21\6\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+ + "\1\35\1\36\1\37\1\40\1\41\1\42\2\43\1\44"+ + "\1\1\1\42\2\45\2\46\1\42\2\1\1\47\1\50"+ + "\1\1\1\51\2\1\1\52\1\1\1\53\2\42\2\54"+ + "\2\42\1\55\1\42\1\1\1\56\1\3\1\0\1\57"+ + "\1\60\1\61\1\62\1\63\1\64\1\65\1\66\1\67"+ + "\1\70\1\71\1\72\1\73\1\74\1\75\1\76\1\0"+ + "\1\77\1\63\1\100\1\0\2\100\7\6\1\101\1\102"+ + "\2\6\1\103\16\6\1\104\1\105\1\106\4\6\1\107"+ + "\13\6\1\110\1\111\1\112\1\113\1\114\1\115\1\116"+ + "\1\117\1\120\1\116\1\121\1\122\1\123\1\124\1\125"+ + "\1\126\1\116\1\127\1\0\1\130\1\0\1\131\1\0"+ + "\1\132\1\133\1\0\1\134\4\0\1\135\2\0\1\136"+ + "\4\137\2\3\2\0\1\140\1\141\1\142\1\143\1\144"+ + "\1\0\1\63\1\145\2\146\1\100\1\6\1\147\13\6"+ + "\1\150\4\6\1\151\4\6\1\152\6\6\1\153\12\6"+ + "\1\154\1\6\1\155\1\6\1\156\3\0\1\134\1\157"+ + "\1\160\1\0\1\161\2\0\1\162\1\163\1\164\1\0"+ + "\1\165\1\146\1\100\4\6\1\166\1\167\2\6\1\170"+ + "\12\6\1\171\1\172\1\6\1\173\11\6\1\174\5\6"+ + "\1\175\1\6\1\176\2\0\1\177\1\200\1\0\1\146"+ + "\1\100\1\201\1\202\2\6\1\203\1\6\1\204\1\205"+ + "\1\6\1\206\1\6\1\207\4\6\1\210\11\6\1\211"+ + "\5\6\1\0\1\146\1\100\3\6\1\212\1\6\1\213"+ + "\1\214\1\6\1\215\1\6\1\216\3\6\1\217\3\6"+ + "\1\220\4\6\1\221\1\6\1\0\1\146\1\100\1\222"+ + "\1\6\1\223\10\6\1\224\1\225\1\6\1\226\1\227"+ + "\1\6\1\0\1\146\1\100\1\230\1\231\1\232\3\6"+ + "\1\233\3\6\1\234\1\0\1\146\1\100\1\235\1\6"+ + "\1\236\1\6\1\237\1\240\1\241\1\146\1\100\1\242"+ + "\1\243\6\100"; + + private static int [] zzUnpackAction() { + int [] result = new int[446]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\114\0\230\0\344\0\u0130\0\u017c\0\u01c8\0\u0214"+ + "\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0390\0\u0344\0\u03dc\0\u0428"+ + "\0\u0474\0\u04c0\0\u050c\0\u0558\0\u05a4\0\u05f0\0\u063c\0\u0688"+ + "\0\u06d4\0\u0344\0\u0344\0\u0344\0\u0720\0\u0344\0\u0344\0\u076c"+ + "\0\u07b8\0\u0804\0\u0850\0\u0344\0\u089c\0\u08e8\0\u0934\0\u0980"+ + "\0\u09cc\0\u0a18\0\u0a64\0\u0ab0\0\u0afc\0\u0b48\0\u0b94\0\u0be0"+ + "\0\u0c2c\0\u0c78\0\u0cc4\0\u0d10\0\u0d5c\0\u0344\0\u0344\0\u0344"+ + "\0\u0344\0\u0344\0\u0344\0\u0344\0\u0da8\0\u0df4\0\u0e40\0\u0e8c"+ + "\0\u0344\0\u0ed8\0\u0f24\0\u0344\0\u0344\0\u0f70\0\u0fbc\0\u1008"+ + "\0\u0344\0\u1054\0\u0344\0\u10a0\0\u10ec\0\u1138\0\u0344\0\u0344"+ + "\0\u1184\0\u0344\0\u11d0\0\u121c\0\u0344\0\u1268\0\u0344\0\u0344"+ + "\0\u12b4\0\u1300\0\u0344\0\u134c\0\u1398\0\u0344\0\u13e4\0\u1430"+ + "\0\u0344\0\u147c\0\u14c8\0\u0344\0\u0344\0\u1514\0\u0344\0\u1560"+ + "\0\u0344\0\u15ac\0\u15f8\0\u0344\0\u0344\0\u1644\0\u0344\0\u0344"+ + "\0\u1690\0\u0344\0\u0344\0\u16dc\0\u1728\0\u1774\0\u17c0\0\u180c"+ + "\0\u1858\0\u18a4\0\u18f0\0\u193c\0\u1988\0\u19d4\0\u1a20\0\u1a6c"+ + "\0\u1ab8\0\u0344\0\u0344\0\u1b04\0\u1b50\0\u04c0\0\u1b9c\0\u1be8"+ + "\0\u1c34\0\u1c80\0\u1ccc\0\u1d18\0\u1d64\0\u1db0\0\u1dfc\0\u1e48"+ + "\0\u1e94\0\u1ee0\0\u1f2c\0\u1f78\0\u04c0\0\u04c0\0\u1fc4\0\u2010"+ + "\0\u205c\0\u20a8\0\u20f4\0\u04c0\0\u2140\0\u218c\0\u21d8\0\u2224"+ + "\0\u2270\0\u22bc\0\u2308\0\u2354\0\u23a0\0\u23ec\0\u2438\0\u0344"+ + "\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344"+ + "\0\u2484\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u0344\0\u24d0"+ + "\0\u0344\0\u1138\0\u0344\0\u1184\0\u0344\0\u11d0\0\u0344\0\u0344"+ + "\0\u1268\0\u251c\0\u2568\0\u25b4\0\u2600\0\u264c\0\u2698\0\u26e4"+ + "\0\u2730\0\u0344\0\u0344\0\u2484\0\u24d0\0\u277c\0\u27c8\0\u0344"+ + "\0\u2814\0\u2860\0\u0344\0\u0344\0\u0344\0\u28ac\0\u0344\0\u28f8"+ + "\0\u28f8\0\u0344\0\u2944\0\u180c\0\u2990\0\u29dc\0\u04c0\0\u2a28"+ + "\0\u2a74\0\u2ac0\0\u2b0c\0\u2b58\0\u2ba4\0\u2bf0\0\u2c3c\0\u2c88"+ + "\0\u2cd4\0\u2d20\0\u04c0\0\u2d6c\0\u2db8\0\u2e04\0\u2e50\0\u04c0"+ + "\0\u2e9c\0\u2ee8\0\u2f34\0\u2f80\0\u04c0\0\u2fcc\0\u3018\0\u3064"+ + "\0\u30b0\0\u30fc\0\u3148\0\u04c0\0\u3194\0\u31e0\0\u322c\0\u3278"+ + "\0\u32c4\0\u3310\0\u335c\0\u33a8\0\u33f4\0\u3440\0\u04c0\0\u348c"+ + "\0\u04c0\0\u34d8\0\u04c0\0\u3524\0\u3570\0\u251c\0\u0344\0\u0344"+ + "\0\u0344\0\u35bc\0\u0344\0\u3608\0\u3654\0\u36a0\0\u0344\0\u0344"+ + "\0\u36ec\0\u0344\0\u3738\0\u3784\0\u37d0\0\u381c\0\u3868\0\u38b4"+ + "\0\u04c0\0\u04c0\0\u3900\0\u394c\0\u04c0\0\u3998\0\u39e4\0\u3a30"+ + "\0\u3a7c\0\u3ac8\0\u3b14\0\u3b60\0\u3bac\0\u3bf8\0\u3c44\0\u04c0"+ + "\0\u04c0\0\u3c90\0\u04c0\0\u3cdc\0\u3d28\0\u3d74\0\u3dc0\0\u3e0c"+ + "\0\u3e58\0\u3ea4\0\u3ef0\0\u3f3c\0\u04c0\0\u3f88\0\u3fd4\0\u4020"+ + "\0\u406c\0\u40b8\0\u04c0\0\u4104\0\u0344\0\u2484\0\u4150\0\u0344"+ + "\0\u0344\0\u419c\0\u41e8\0\u4234\0\u04c0\0\u4280\0\u42cc\0\u4318"+ + "\0\u04c0\0\u4364\0\u04c0\0\u04c0\0\u43b0\0\u04c0\0\u43fc\0\u04c0"+ + "\0\u4448\0\u4494\0\u44e0\0\u452c\0\u04c0\0\u4578\0\u45c4\0\u4610"+ + "\0\u465c\0\u46a8\0\u46f4\0\u4740\0\u478c\0\u47d8\0\u04c0\0\u4824"+ + "\0\u4870\0\u48bc\0\u4908\0\u4954\0\u49a0\0\u49ec\0\u4a38\0\u4a84"+ + "\0\u4ad0\0\u4b1c\0\u04c0\0\u4b68\0\u04c0\0\u04c0\0\u4bb4\0\u04c0"+ + "\0\u4c00\0\u04c0\0\u4c4c\0\u4c98\0\u4ce4\0\u04c0\0\u4d30\0\u4d7c"+ + "\0\u4dc8\0\u04c0\0\u4e14\0\u4e60\0\u4eac\0\u4ef8\0\u04c0\0\u4f44"+ + "\0\u4f90\0\u4fdc\0\u5028\0\u04c0\0\u5074\0\u04c0\0\u50c0\0\u510c"+ + "\0\u5158\0\u51a4\0\u51f0\0\u523c\0\u5288\0\u52d4\0\u04c0\0\u04c0"+ + "\0\u5320\0\u04c0\0\u04c0\0\u536c\0\u53b8\0\u5404\0\u5450\0\u04c0"+ + "\0\u04c0\0\u04c0\0\u549c\0\u54e8\0\u5534\0\u04c0\0\u5580\0\u55cc"+ + "\0\u5618\0\u04c0\0\u5664\0\u56b0\0\u56fc\0\u04c0\0\u5748\0\u04c0"+ + "\0\u5794\0\u04c0\0\u04c0\0\u0344\0\u0344\0\u57e0\0\u04c0\0\u04c0"+ + "\0\u582c\0\u5878\0\u58c4\0\u5910\0\u595c\0\u1774"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[446]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\14"+ + "\1\22\1\23\1\24\1\17\1\25\1\26\1\27\1\30"+ + "\1\22\1\31\1\14\1\32\1\33\4\22\1\34\1\35"+ + "\1\36\1\37\1\40\2\22\1\41\2\31\1\22\1\42"+ + "\1\43\1\14\1\44\1\45\1\46\1\47\1\22\1\50"+ + "\1\51\1\52\1\53\1\54\1\55\1\56\1\57\1\22"+ + "\1\60\1\22\1\61\2\22\1\62\1\63\1\64\1\65"+ + "\1\66\1\67\1\70\1\71\1\72\1\73\1\74\1\75"+ + "\1\76\1\77\1\100\1\101\1\22\1\14\1\102\1\103"+ + "\1\104\30\102\1\105\12\102\1\106\45\102\1\107\1\110"+ + "\1\111\31\107\1\105\11\107\1\106\45\107\1\14\1\112"+ + "\1\113\1\114\1\115\3\14\1\116\2\14\1\114\2\14"+ + "\1\117\2\116\4\14\4\116\5\14\3\116\2\14\2\116"+ + "\3\14\26\116\2\14\1\120\46\14\1\121\44\14\1\122"+ + "\14\14\1\112\1\113\1\114\4\14\1\123\2\14\1\114"+ + "\3\14\2\123\2\14\1\124\1\14\4\123\5\14\3\123"+ + "\2\14\2\123\3\14\26\123\2\14\1\125\46\14\1\126"+ + "\44\14\1\127\13\14\1\130\1\112\1\113\26\130\1\131"+ + "\63\130\1\132\1\133\12\130\1\134\77\130\1\112\1\113"+ + "\7\130\1\135\65\130\1\136\13\130\1\137\1\110\1\111"+ + "\43\137\1\140\1\141\44\137\116\0\1\16\114\0\1\17"+ + "\7\0\1\17\104\0\1\142\1\143\24\0\1\144\113\0"+ + "\1\145\67\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\26\22\14\0\1\22\12\0\1\146\1\147"+ + "\6\0\1\150\13\0\1\150\3\0\2\150\33\0\1\151"+ + "\25\0\1\152\1\0\1\153\4\0\2\152\4\0\4\152"+ + "\1\0\1\154\3\0\3\152\2\0\2\152\3\0\26\152"+ + "\2\0\1\155\45\0\1\156\76\0\1\157\14\0\1\160"+ + "\77\0\1\161\13\0\1\162\100\0\1\163\105\0\1\150"+ + "\7\0\1\31\13\0\1\31\3\0\2\31\2\164\101\0"+ + "\1\165\72\0\1\150\7\0\1\166\13\0\1\167\2\170"+ + "\1\0\1\171\1\172\2\164\55\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\2\22\1\173\3\22"+ + "\1\174\2\22\1\175\1\176\13\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\1\22\1\177"+ + "\6\22\3\0\2\22\1\200\11\22\1\201\11\22\14\0"+ + "\1\22\33\0\1\202\12\0\1\203\54\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\1\22\1\204"+ + "\24\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\7\22\1\205\3\0\26\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\5\22\1\206\20\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22"+ + "\1\207\3\22\1\210\5\22\1\211\11\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22"+ + "\1\212\3\0\10\22\1\213\1\22\1\214\2\22\1\215"+ + "\10\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\22\22\1\216\3\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\7\22\1\217\3\0\2\22\1\220\7\22\1\221\13\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\1\22\1\222\14\22\1\223\1\22"+ + "\1\224\5\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\3\22\1\225\4\22\3\0\5\22"+ + "\1\226\1\22\1\227\11\22\1\230\4\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\5\22\1\231\1\22\1\232\16\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22"+ + "\1\233\3\0\6\22\1\234\11\22\1\235\5\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\11\22\1\236\4\22\1\237\7\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\1\22\1\240\1\241\7\22\1\242\13\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\2\22\1\243\3\22\1\244\17\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\7\22\1\245\3\0\26\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\7\22\1\246\16\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\2\22\1\247"+ + "\23\22\14\0\1\22\33\0\1\250\52\0\1\251\40\0"+ + "\1\252\53\0\1\253\37\0\1\254\113\0\1\255\61\0"+ + "\1\102\2\0\30\102\1\0\12\102\1\0\45\102\2\0"+ + "\1\104\111\0\1\256\3\0\27\256\1\257\1\260\1\256"+ + "\1\261\1\256\1\262\5\256\1\263\1\256\1\264\1\265"+ + "\5\256\1\266\1\267\1\256\1\270\30\256\1\0\1\107"+ + "\2\0\31\107\1\0\11\107\1\0\45\107\2\0\1\111"+ + "\113\0\1\113\114\0\1\114\7\0\1\114\116\0\1\271"+ + "\105\0\2\272\3\0\1\272\1\0\4\272\2\0\4\272"+ + "\1\0\1\273\2\0\10\272\3\0\26\272\16\0\1\274"+ + "\2\0\30\274\1\275\60\274\10\0\2\276\3\0\1\276"+ + "\1\0\4\276\2\0\4\276\1\0\1\277\2\0\10\276"+ + "\3\0\26\276\34\0\1\300\75\0\1\301\2\0\30\301"+ + "\1\302\1\303\57\301\31\0\1\304\64\0\1\133\126\0"+ + "\1\305\102\0\1\306\3\0\1\307\3\0\1\310\2\0"+ + "\2\307\2\0\1\311\1\0\4\307\5\0\3\307\2\0"+ + "\2\307\3\0\26\307\2\0\1\312\13\0\1\137\2\0"+ + "\43\137\2\0\44\137\1\313\3\0\32\313\1\314\1\313"+ + "\1\262\5\313\1\263\1\313\1\264\1\265\5\313\1\266"+ + "\1\267\1\313\1\315\27\313\1\316\1\0\1\142\1\317"+ + "\1\320\111\142\5\321\1\322\106\321\11\0\1\323\123\0"+ + "\1\150\13\0\1\150\3\0\2\150\2\164\57\0\2\152"+ + "\3\0\1\152\1\0\4\152\2\0\4\152\4\0\10\152"+ + "\3\0\26\152\50\0\1\324\113\0\1\325\77\0\1\326"+ + "\13\0\1\327\76\0\1\330\3\0\1\331\13\0\1\331"+ + "\3\0\2\331\2\0\1\330\100\0\1\332\72\0\1\150"+ + "\7\0\1\166\13\0\1\166\3\0\2\166\2\164\60\0"+ + "\1\150\7\0\1\166\13\0\1\167\3\0\1\171\1\172"+ + "\2\164\67\0\2\333\3\0\3\333\5\0\1\334\2\0"+ + "\5\333\3\0\1\333\1\0\1\333\1\0\1\333\6\0"+ + "\1\333\41\0\1\150\7\0\1\166\13\0\1\172\3\0"+ + "\2\172\2\164\60\0\1\150\7\0\1\166\13\0\1\335"+ + "\3\0\2\335\2\164\55\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\14\22\1\336\11\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\1\22\1\337\24\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\7\22\1\340\16\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\7\22\1\341"+ + "\16\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\10\22\1\342\15\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\4\22\1\343\21\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\5\22\1\344\20\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\7\22\1\345\3\0\26\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\10\22\1\346\15\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\5\22\1\347\2\22\1\350\15\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\7\22\1\351\16\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22"+ + "\1\352\23\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\10\22\1\353\15\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\2\22\1\354\23\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\17\22\1\355\6\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\11\22"+ + "\1\356\14\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\7\22\1\357\3\0\26\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\15\22\1\360\10\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\10\22\1\361\10\22\1\362\4\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\14\22\1\363\11\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\12\22\1\364"+ + "\5\22\1\365\5\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\1\22\1\366"+ + "\7\22\1\367\14\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\17\22\1\370"+ + "\6\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\5\22\1\371\2\22\1\372"+ + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\17\22\1\373\6\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\7\22\1\374\3\0\26\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\13\22"+ + "\1\375\12\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\3\22\1\376\4\22\3\0\14\22"+ + "\1\377\11\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\7\22\1\u0100\16\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\10\22\1\u0101\15\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\11\22\1\u0102\14\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\6\22"+ + "\1\u0103\2\22\1\u0104\14\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\4\22"+ + "\1\u0105\21\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\1\u0106\25\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\1\22\1\u0107\24\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\11\22\1\u0108\14\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\10\22\1\u0109"+ + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\3\22\1\u010a\4\22\3\0\26\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\25\22\1\u010b\14\0\1\22\21\0\2\u010c"+ + "\3\0\3\u010c\5\0\1\u010c\2\0\5\u010c\3\0\1\u010c"+ + "\1\0\1\u010c\1\0\1\u010c\6\0\1\u010c\50\0\2\u010d"+ + "\3\0\3\u010d\5\0\1\u010d\2\0\5\u010d\3\0\1\u010d"+ + "\1\0\1\u010d\1\0\1\u010d\6\0\1\u010d\30\0\1\u010e"+ + "\2\0\30\u010e\1\302\1\0\57\u010e\1\303\2\0\30\303"+ + "\1\u010f\60\303\16\0\1\u0110\113\0\1\u0111\105\0\1\u0112"+ + "\6\0\2\u0112\4\0\4\u0112\5\0\3\u0112\2\0\2\u0112"+ + "\3\0\26\u0112\2\0\1\u0113\23\0\2\307\3\0\1\307"+ + "\1\0\4\307\2\0\4\307\4\0\10\307\3\0\26\307"+ + "\33\0\1\u0114\6\0\1\u0115\77\0\1\u0116\6\0\2\u0116"+ + "\4\0\4\u0116\5\0\3\u0116\2\0\2\u0116\3\0\26\u0116"+ + "\2\0\1\u0117\62\0\1\u0118\46\0\1\320\111\0\5\321"+ + "\1\u0119\106\321\4\0\1\320\1\322\140\0\1\u011a\102\0"+ + "\1\331\13\0\1\331\3\0\2\331\71\0\2\u011b\3\0"+ + "\3\u011b\5\0\1\u011b\2\0\5\u011b\3\0\1\u011b\1\0"+ + "\1\u011b\1\0\1\u011b\6\0\1\u011b\41\0\1\150\7\0"+ + "\1\166\13\0\1\u011c\3\0\2\u011c\2\164\55\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\5\22"+ + "\1\u011d\20\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\2\22\1\u011e\23\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\4\22\1\u011f\21\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22"+ + "\1\u0120\3\0\26\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\16\22\1\u0121"+ + "\7\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\7\22\1\u0122\3\0\26\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\2\22\1\u0123\23\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\12\22"+ + "\1\u0124\13\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\7\22\1\u0125\3\0\26\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\4\22\1\u0126\21\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\5\22\1\u0127\2\22\1\u0128\15\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\5\22\1\u0129\20\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\10\22\1\u012a"+ + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\7\22\1\u012b\3\0\26\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\10\22\1\u012c\15\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\1\22"+ + "\1\u012d\24\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\11\22\1\u012e\14\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\7\22\1\u012f\3\0\26\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\14\22\1\u0130\11\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\7\22\1\u0131\3\0\26\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\6\22\1\u0132\17\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\5\22\1\u0133\20\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u0134\3\0"+ + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\10\22\1\u0135\15\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\7\22\1\u0136\3\0\26\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\6\22"+ + "\1\u0137\5\22\1\u0138\11\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u0139\3\0"+ + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\2\22\1\u013a\23\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\7\22\1\u013b\3\0\26\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22"+ + "\1\u013c\23\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\16\22\1\u013d\7\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\14\22\1\u013e\11\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\10\22\1\u013f\15\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\22\22"+ + "\1\u0140\3\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\3\22\1\u0141\22\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\14\22\1\u0142\11\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\13\22\1\u0143\12\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\11\22"+ + "\1\u0144\14\22\14\0\1\22\21\0\2\u0145\3\0\3\u0145"+ + "\5\0\1\u0145\2\0\5\u0145\3\0\1\u0145\1\0\1\u0145"+ + "\1\0\1\u0145\6\0\1\u0145\50\0\2\u0146\3\0\3\u0146"+ + "\5\0\1\u0146\2\0\5\u0146\3\0\1\u0146\1\0\1\u0146"+ + "\1\0\1\u0146\6\0\1\u0146\31\0\2\u0147\5\0\2\u0112"+ + "\1\0\1\u0147\1\0\1\u0112\1\u0148\4\u0112\2\0\4\u0112"+ + "\4\0\10\u0112\3\0\26\u0112\33\0\1\u0149\123\0\1\u014a"+ + "\76\0\2\u0116\3\0\1\u0116\1\0\4\u0116\2\0\4\u0116"+ + "\4\0\10\u0116\3\0\26\u0116\16\0\4\321\1\320\1\u0119"+ + "\106\321\20\0\2\u014b\3\0\3\u014b\5\0\1\u014b\2\0"+ + "\5\u014b\3\0\1\u014b\1\0\1\u014b\1\0\1\u014b\6\0"+ + "\1\u014b\41\0\1\150\7\0\1\166\13\0\1\u014c\3\0"+ + "\2\u014c\2\164\55\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\7\22\1\u014d\3\0\26\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\14\22\1\u014e\11\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\10\22\1\u014f"+ + "\15\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\7\22\1\u0150\16\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\3\22\1\u0151\22\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\1\22\1\u0152\24\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\16\22\1\u0153"+ + "\7\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\10\22\1\u0154\15\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\11\22\1\u0155\14\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\5\22\1\u0156\20\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\11\22\1\u0157"+ + "\14\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\1\22\1\u0158\24\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\4\22\1\u0159\21\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\1\22\1\u015a\24\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\22\22\1\u015b"+ + "\3\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\5\22\1\u015c\20\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\15\22\1\u015d\10\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\6\22\1\u015e\17\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\2\22\1\u015f"+ + "\23\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\1\22\1\u0160\24\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\1\22\1\u0161\24\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\7\22\1\u0162"+ + "\3\0\26\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\3\22\1\u0163\4\22\3\0\26\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\12\22\1\u0164\13\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\10\22\1\u0165\15\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\21\22"+ + "\1\u0166\4\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\7\22\1\u0167\3\0\26\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\7\22\1\u0168\3\0\26\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\2\22"+ + "\1\u0169\23\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\2\22\1\u016a\23\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\11\22\1\u016b\14\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\7\22\1\u016c\16\22\14\0\1\22\2\0\2\u0147"+ + "\10\0\1\u0147\2\0\1\u0148\123\0\1\u016d\105\0\2\u016e"+ + "\3\0\3\u016e\5\0\1\u016e\2\0\5\u016e\3\0\1\u016e"+ + "\1\0\1\u016e\1\0\1\u016e\6\0\1\u016e\41\0\1\150"+ + "\7\0\1\166\13\0\1\u016f\3\0\2\u016f\2\164\55\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\14\22\1\u0170\11\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\11\22\1\u0171"+ + "\14\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\13\22\1\u0172\12\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\7\22\1\u0173\16\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\7\22\1\u0174\16\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\4\22\1\u0175"+ + "\21\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\16\22\1\u0176\7\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\11\22\1\u0177\14\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\7\22\1\u0178"+ + "\3\0\26\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\17\22\1\u0179\6\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\3\22\1\u017a\4\22\3\0\26\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\7\22\1\u017b\16\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\3\22\1\u017c\4\22"+ + "\3\0\7\22\1\u017d\16\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\10\22"+ + "\1\u017e\15\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\21\22\1\u017f\4\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\11\22\1\u0180\14\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\14\22\1\u0181\11\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u0182\3\0"+ + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\11\22\1\u0183\14\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\4\22\1\u0184\21\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\10\22\1\u0185\15\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\23\22\1\u0186"+ + "\2\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\4\22\1\u0187\21\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\11\22\1\u0188\14\22\14\0\1\22\30\0"+ + "\1\u0189\104\0\2\u018a\3\0\3\u018a\5\0\1\u018a\2\0"+ + "\5\u018a\3\0\1\u018a\1\0\1\u018a\1\0\1\u018a\6\0"+ + "\1\u018a\41\0\1\150\7\0\1\166\13\0\1\u018b\3\0"+ + "\2\u018b\2\164\55\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\20\22\1\u018c\5\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\6\22\1\u018d\17\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\5\22"+ + "\1\u018e\20\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\12\22\1\u018f\13\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\13\22\1\u0190\12\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\2\22\1\u0191\23\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\4\22"+ + "\1\u0192\21\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\2\22\1\u0193\23\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\10\22\3\0\2\22\1\u0194\23\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22"+ + "\1\u0195\3\0\26\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\7\22\1\u0196"+ + "\16\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\10\22\1\u0197\15\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\4\22\1\u0198\21\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\10\22\1\u0199\15\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\7\22\1\u019a\3\0\26\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\7\22\1\u019b\3\0\26\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\10\22\1\u019c\15\22\14\0\1\22\31\0\1\u019d\103\0"+ + "\2\u019e\3\0\3\u019e\5\0\1\u019e\2\0\5\u019e\3\0"+ + "\1\u019e\1\0\1\u019e\1\0\1\u019e\6\0\1\u019e\41\0"+ + "\1\150\7\0\1\166\13\0\1\u019f\3\0\2\u019f\2\164"+ + "\55\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\7\22\1\u01a0\16\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u01a1\3\0"+ + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\7\22\1\u01a2\3\0\26\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\4\22\1\u01a3\21\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\7\22\1\u01a4\3\0"+ + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\4\22\1\u01a5\21\22\14\0"+ + "\1\22\7\0\3\22\7\0\2\22\3\0\4\22\4\0"+ + "\10\22\3\0\14\22\1\u01a6\11\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\7\22\1\u01a7\16\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\7\22\1\u01a8\3\0\26\22"+ + "\14\0\1\22\7\0\3\22\7\0\2\22\3\0\4\22"+ + "\4\0\7\22\1\u01a9\3\0\26\22\14\0\1\22\7\0"+ + "\3\22\7\0\2\22\3\0\4\22\4\0\10\22\3\0"+ + "\20\22\1\u01aa\5\22\14\0\1\22\30\0\1\u01ab\104\0"+ + "\2\u01ac\3\0\3\u01ac\5\0\1\u01ac\2\0\5\u01ac\3\0"+ + "\1\u01ac\1\0\1\u01ac\1\0\1\u01ac\6\0\1\u01ac\41\0"+ + "\1\150\7\0\1\166\13\0\1\u01ad\3\0\2\u01ad\2\164"+ + "\55\0\3\22\7\0\2\22\3\0\4\22\4\0\7\22"+ + "\1\u01ae\3\0\26\22\14\0\1\22\7\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\10\22\3\0\6\22\1\u01af"+ + "\17\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\7\22\1\u01b0\3\0\26\22\14\0\1\22"+ + "\7\0\3\22\7\0\2\22\3\0\4\22\4\0\10\22"+ + "\3\0\10\22\1\u01b1\15\22\14\0\1\22\7\0\3\22"+ + "\7\0\2\22\3\0\4\22\4\0\10\22\3\0\13\22"+ + "\1\u01b2\12\22\14\0\1\22\7\0\3\22\7\0\2\22"+ + "\3\0\4\22\4\0\10\22\3\0\13\22\1\u01b3\12\22"+ + "\14\0\1\22\25\0\1\u01b4\107\0\2\u01b5\3\0\3\u01b5"+ + "\5\0\1\u01b5\2\0\5\u01b5\3\0\1\u01b5\1\0\1\u01b5"+ + "\1\0\1\u01b5\6\0\1\u01b5\41\0\1\150\7\0\1\166"+ + "\13\0\1\u01b6\3\0\2\u01b6\2\164\55\0\3\22\7\0"+ + "\2\22\3\0\4\22\4\0\3\22\1\u01b7\4\22\3\0"+ + "\26\22\14\0\1\22\7\0\3\22\7\0\2\22\3\0"+ + "\4\22\4\0\10\22\3\0\5\22\1\u01b8\20\22\14\0"+ + "\1\22\12\0\1\150\7\0\1\166\13\0\1\u01b9\3\0"+ + "\2\u01b9\2\164\60\0\1\150\7\0\1\166\13\0\1\u01ba"+ + "\3\0\2\u01ba\2\164\60\0\1\150\7\0\1\166\13\0"+ + "\1\u01bb\3\0\2\u01bb\2\164\60\0\1\150\7\0\1\166"+ + "\13\0\1\u01bc\3\0\2\u01bc\2\164\60\0\1\150\7\0"+ + "\1\166\13\0\1\u01bd\3\0\2\u01bd\2\164\60\0\1\150"+ + "\7\0\1\166\13\0\1\u01be\3\0\2\u01be\2\164\47\0"; + + private static int [] zzUnpackTrans() { + int [] result = new int[22952]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\13\0\1\11\1\1\1\11\13\1\3\11\1\1\2\11"+ + "\4\1\1\11\21\1\7\11\4\1\1\11\2\1\2\11"+ + "\3\1\1\11\1\1\1\11\3\1\2\11\1\1\1\11"+ + "\2\1\1\11\1\1\2\11\2\1\1\11\2\1\1\11"+ + "\2\1\1\11\1\1\1\0\2\11\1\1\1\11\1\1"+ + "\1\11\2\1\2\11\1\1\2\11\1\1\2\11\1\0"+ + "\3\1\1\0\11\1\2\11\44\1\11\11\1\1\6\11"+ + "\1\1\1\11\1\0\1\11\1\0\1\11\1\0\2\11"+ + "\1\0\1\1\4\0\1\1\2\0\2\11\4\1\1\11"+ + "\2\0\3\11\1\1\1\11\1\0\1\1\1\11\61\1"+ + "\3\0\3\11\1\0\1\11\2\0\1\1\2\11\1\0"+ + "\1\11\52\1\1\11\2\0\2\11\1\0\42\1\1\0"+ + "\33\1\1\0\23\1\1\0\15\1\1\0\10\1\2\11"+ + "\11\1"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[446]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the input device */ + private java.io.Reader zzReader; + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** number of newlines encountered up to the start of the matched text */ + private int yyline; + + /** the number of characters up to the start of the matched text */ + private int yychar; + + /** + * the number of characters from the last newline up to the start of the + * matched text + */ + private int yycolumn; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /** denotes if the user-EOF-code has already been executed */ + private boolean zzEOFDone; + + /** + * The number of occupied positions in zzBuffer beyond zzEndRead. + * When a lead/high surrogate has been read from the input stream + * into the final zzBuffer position, this will have a value of 1; + * otherwise, it will have a value of 0. + */ + private int zzFinalHighSurrogate = 0; + + /* user code: */ + + private String sourceCode; + + public ActionScriptLexer(String sourceCode){ + this(new StringReader(sourceCode)); + this.sourceCode = sourceCode; + } + + public void yypushbackstr(String s, int state) + { + sourceCode = s + sourceCode.substring(yychar + yylength()); + yyreset(new StringReader(sourceCode)); + yybegin(state); + } + + public void yypushbackstr(String s) + { + yypushbackstr(s, YYINITIAL); + } + + StringBuffer string = new StringBuffer(); + + private static String xmlTagName = ""; + + public int yychar() { + return yychar; + } + + private Stack pushedBack = new Stack<>(); + + public int yyline() { + return yyline + 1; + } + + private List listeners=new ArrayList<>(); + + public void addListener(LexListener listener){ + listeners.add(listener); + } + + public void removeListener(LexListener listener){ + listeners.remove(listener); + } + + public void informListenersLex(ParsedSymbol s){ + for(LexListener l:listeners){ + l.onLex(s); + } + } + + public void informListenersPushBack(ParsedSymbol s){ + for(LexListener l:listeners){ + l.onPushBack(s); + } + } + + public void pushback(ParsedSymbol symb) { + pushedBack.push(symb); + last = null; + informListenersPushBack(symb); + } + + ParsedSymbol last; + public ParsedSymbol lex() throws java.io.IOException, AVM2ParseException{ + ParsedSymbol ret = null; + if (!pushedBack.isEmpty()){ + ret = last = pushedBack.pop(); + } else { + ret = last = yylex(); + } + informListenersLex(ret); + return ret; + } + + + + /** + * Creates a new scanner + * + * @param in the java.io.Reader to read input from. + */ + public ActionScriptLexer(java.io.Reader in) { + this.zzReader = in; + } + + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x110000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 3140) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + + /* first: make room (if you can) */ + if (zzStartRead > 0) { + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 0; + System.arraycopy(zzBuffer, zzStartRead, + zzBuffer, 0, + zzEndRead-zzStartRead); + + /* translate stored positions */ + zzEndRead-= zzStartRead; + zzCurrentPos-= zzStartRead; + zzMarkedPos-= zzStartRead; + zzStartRead = 0; + } + + /* is the buffer big enough? */ + if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate) { + /* if not: blow it up */ + char newBuffer[] = new char[zzBuffer.length*2]; + System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); + zzBuffer = newBuffer; + zzEndRead += zzFinalHighSurrogate; + zzFinalHighSurrogate = 0; + } + + /* fill the buffer with new input */ + int requested = zzBuffer.length - zzEndRead; + int totalRead = 0; + while (totalRead < requested) { + int numRead = zzReader.read(zzBuffer, zzEndRead + totalRead, requested - totalRead); + if (numRead == -1) { + break; + } + totalRead += numRead; + } + + if (totalRead > 0) { + zzEndRead += totalRead; + if (totalRead == requested) { /* possibly more input available */ + if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1])) { + --zzEndRead; + zzFinalHighSurrogate = 1; + } + } + return false; + } + + // totalRead = 0: End of stream + return true; + } + + + /** + * Closes the input stream. + */ + public final void yyclose() throws java.io.IOException { + zzAtEOF = true; /* indicate end of file */ + zzEndRead = zzStartRead; /* invalidate buffer */ + + if (zzReader != null) + zzReader.close(); + } + + + /** + * 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. + * + * Internal scan buffer is resized down to its initial length, if it has grown. + * + * @param reader the new input stream + */ + public final void yyreset(java.io.Reader reader) { + zzReader = reader; + zzAtBOL = true; + zzAtEOF = false; + zzEOFDone = false; + zzEndRead = zzStartRead = 0; + zzCurrentPos = zzMarkedPos = 0; + zzFinalHighSurrogate = 0; + yyline = yychar = yycolumn = 0; + zzLexicalState = YYINITIAL; + if (zzBuffer.length > ZZ_BUFFERSIZE) + zzBuffer = new char[ZZ_BUFFERSIZE]; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final String yytext() { + return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBuffer[zzStartRead+pos]; + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public ParsedSymbol yylex() throws java.io.IOException, AVM2ParseException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + char [] zzBufferL = zzBuffer; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + yychar+= zzMarkedPosL-zzStartRead; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + // set up zzAction for empty match case: + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + } + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); + } + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL); + zzCurrentPosL += Character.charCount(zzInput); + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 1: + { + } + case 164: break; + case 2: + { yyline++; + } + case 165: break; + case 3: + { /*ignore*/ + } + case 166: break; + case 4: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); + } + case 167: break; + case 5: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); + } + case 168: break; + case 6: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + } + case 169: break; + case 7: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); + } + case 170: break; + case 8: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); + } + case 171: break; + case 9: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); + } + case 172: break; + case 10: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); + } + case 173: break; + case 11: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); + } + case 174: break; + case 12: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); + } + case 175: break; + case 13: + { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); + } + case 176: break; + case 14: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); + } + case 177: break; + case 15: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); + } + case 178: break; + case 16: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); + } + case 179: break; + case 17: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); + } + case 180: break; + case 18: + { string.setLength(0); + yybegin(STRING); + } + case 181: break; + case 19: + { string.setLength(0); + yybegin(CHARLITERAL); + } + case 182: break; + case 20: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); + } + case 183: break; + case 21: + { string.setLength(0); + yybegin(OIDENTIFIER); + } + case 184: break; + case 22: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); + } + case 185: break; + case 23: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); + } + case 186: break; + case 24: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); + } + case 187: break; + case 25: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); + } + case 188: break; + case 26: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); + } + case 189: break; + case 27: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); + } + case 190: break; + case 28: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); + } + case 191: break; + case 29: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); + } + case 192: break; + case 30: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); + } + case 193: break; + case 31: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); + } + case 194: break; + case 32: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); + } + case 195: break; + case 33: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); + } + case 196: break; + case 34: + { string.append(yytext()); + } + case 197: break; + case 35: + { yybegin(YYINITIAL); yyline++; + } + case 198: break; + case 36: + { yybegin(YYINITIAL); + // length also includes the trailing quote + return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); + } + case 199: break; + case 37: + { yybegin(YYINITIAL); yyline++; + } + case 200: break; + case 38: + { string.append(yytext()); yyline++; + } + case 201: break; + case 39: + { yybegin(XML); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_END, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 202: break; + case 40: + { yybegin(YYINITIAL); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRNAMEVAR_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 203: break; + case 41: + { yybegin(YYINITIAL); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRVALVAR_BEGIN, yytext()); + } + case 204: break; + case 42: + { yybegin(YYINITIAL); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRNAMEVAR_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 205: break; + case 43: + { yybegin(YYINITIAL); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRVALVAR_BEGIN, yytext()); + } + case 206: break; + case 44: + { string.append(yytext()); yyline++; + } + case 207: break; + case 45: + { yybegin(YYINITIAL); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_VAR_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 208: break; + case 46: + { yybegin(YYINITIAL); + // length also includes the trailing quote + return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); + } + case 209: break; + case 47: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); + } + case 210: break; + case 48: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); + } + case 211: break; + case 49: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DESCENDANTS, yytext()); + } + case 212: break; + case 50: + { return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, yytext()); + } + case 213: break; + case 51: + { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); + } + case 214: break; + case 52: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FILTER, yytext()); + } + case 215: break; + case 53: + { yybegin(XMLOPENTAG); + string.setLength(0); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_BEGIN, yytext()); + } + case 216: break; + case 54: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); + } + case 217: break; + case 55: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); + } + case 218: break; + case 56: + { return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTVARTAG_BEGIN, yytext()); + } + case 219: break; + case 57: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); + } + case 220: break; + case 58: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); + } + case 221: break; + case 59: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); + } + case 222: break; + case 60: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); + } + case 223: break; + case 61: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); + } + case 224: break; + case 62: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, yytext()); + } + case 225: break; + case 63: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); + } + case 226: break; + case 64: + { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); + } + case 227: break; + case 65: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); + } + case 228: break; + case 66: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); + } + case 229: break; + case 67: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); + } + case 230: break; + case 68: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IF, yytext()); + } + case 231: break; + case 69: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); + } + case 232: break; + case 70: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IN, yytext()); + } + case 233: break; + case 71: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DO, yytext()); + } + case 234: break; + case 72: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); + } + case 235: break; + case 73: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); + } + case 236: break; + case 74: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); + } + case 237: break; + case 75: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); + } + case 238: break; + case 76: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); + } + case 239: break; + case 77: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); + } + case 240: break; + case 78: + { /* ignore illegal character escape */ + } + case 241: break; + case 79: + { string.append('\"'); + } + case 242: break; + case 80: + { string.append('\''); + } + case 243: break; + case 81: + { string.append('\f'); + } + case 244: break; + case 82: + { string.append('\\'); + } + case 245: break; + case 83: + { string.append('\b'); + } + case 246: break; + case 84: + { string.append('\r'); + } + case 247: break; + case 85: + { string.append('\n'); + } + case 248: break; + case 86: + { string.append('\t'); + } + case 249: break; + case 87: + { yybegin(XML); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTFINISHTAG_END, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 250: break; + case 88: + { yybegin(XMLOPENTAGATTRIB); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTENAME, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 251: break; + case 89: + { yybegin(XMLOPENTAG); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext()); + } + case 252: break; + case 90: + { yybegin(XMLINSTRATTRIB); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTENAME, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 253: break; + case 91: + { yybegin(XML); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTR_END, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 254: break; + case 92: + { yybegin(XMLINSTROPENTAG); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext()); + } + case 255: break; + case 93: + { yybegin(XMLOPENTAG); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 256: break; + case 94: + { yybegin(YYINITIAL); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTVARTAG_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 257: break; + case 95: + { throw new AVM2ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); + } + case 258: break; + case 96: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); + } + case 259: break; + case 97: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); + } + case 260: break; + case 98: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); + } + case 261: break; + case 99: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); + } + case 262: break; + case 100: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); + } + case 263: break; + case 101: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); + } + case 264: break; + case 102: + { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); + } + case 265: break; + case 103: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); + } + case 266: break; + case 104: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.SET, yytext()); + } + case 267: break; + case 105: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); + } + case 268: break; + case 106: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); + } + case 269: break; + case 107: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.USE, yytext()); + } + case 270: break; + case 108: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); + } + case 271: break; + case 109: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.GET, yytext()); + } + case 272: break; + case 110: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NAN, yytext()); + } + case 273: break; + case 111: + { string.append(yytext()); + yybegin(XML); + String ret = string.toString(); + string.setLength(0); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_CDATA, ret); + } + case 274: break; + case 112: + { string.append(yytext()); + yybegin(XML); + String ret = string.toString(); + string.setLength(0); + return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_COMMENT, ret); + } + case 275: break; + case 113: + { yybegin(YYINITIAL); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_FINISHVARTAG_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 276: break; + case 114: + { yybegin(XMLINSTROPENTAG); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTR_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 277: break; + case 115: + { yybegin(YYINITIAL); + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRVARTAG_BEGIN, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 278: break; + case 116: + { string.append('\u00A7'); + } + case 279: break; + case 117: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); + } + case 280: break; + case 118: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.EACH, yytext()); + } + case 281: break; + case 119: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); + } + case 282: break; + case 120: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); + } + case 283: break; + case 121: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); + } + case 284: break; + case 122: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); + } + case 285: break; + case 123: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); + } + case 286: break; + case 124: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); + } + case 287: break; + case 125: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); + } + case 288: break; + case 126: + { char val = (char) Integer.parseInt(yytext().substring(2), 16); + string.append(val); + } + case 289: break; + case 127: + { pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_FINISHTAG, yytext())); + if (string.length() > 0){ + pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString())); + string.setLength(0); + } + return lex(); + } + case 290: break; + case 128: + { String ret = string.toString(); string.setLength(0); string.append(yytext()); yybegin(XMLCOMMENT); + if (!ret.isEmpty()) return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, ret); + } + case 291: break; + case 129: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); + } + case 292: break; + case 130: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.FINAL, yytext()); + } + case 293: break; + case 131: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); + } + case 294: break; + case 132: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); + } + case 295: break; + case 133: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONST, yytext()); + } + case 296: break; + case 134: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); + } + case 297: break; + case 135: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); + } + case 298: break; + case 136: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); + } + case 299: break; + case 137: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); + } + case 300: break; + case 138: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); + } + case 301: break; + case 139: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.STATIC, yytext()); + } + case 302: break; + case 140: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); + } + case 303: break; + case 141: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.NATIVE, yytext()); + } + case 304: break; + case 142: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); + } + case 305: break; + case 143: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); + } + case 306: break; + case 144: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); + } + case 307: break; + case 145: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); + } + case 308: break; + case 146: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); + } + case 309: break; + case 147: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); + } + case 310: break; + case 148: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); + } + case 311: break; + case 149: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.DYNAMIC, yytext()); + } + case 312: break; + case 150: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); + } + case 313: break; + case 151: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PACKAGE, yytext()); + } + case 314: break; + case 152: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); + } + case 315: break; + case 153: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); + } + case 316: break; + case 154: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.OVERRIDE, yytext()); + } + case 317: break; + case 155: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERNAL, yytext()); + } + case 318: break; + case 156: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.INFINITY, yytext()); + } + case 319: break; + case 157: + { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.NAMESPACE, yytext()); + } + case 320: break; + case 158: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); + } + case 321: break; + case 159: + { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); + } + case 322: break; + case 160: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PROTECTED, yytext()); + } + case 323: break; + case 161: + { String ret = string.toString(); string.setLength(0); string.append(yytext() ); yybegin(XMLCDATA); + if (!ret.isEmpty()) return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, ret); + } + case 324: break; + case 162: + { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); + } + case 325: break; + case 163: + { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); + } + case 326: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + { + return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); + } + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoABCDefineTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoABC2Tag.java similarity index 92% rename from libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoABCDefineTag.java rename to libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoABC2Tag.java index e83689b84..3a9a6c23e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoABCDefineTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoABC2Tag.java @@ -39,11 +39,11 @@ import java.io.OutputStream; * * @author JPEXS */ -public class DoABCDefineTag extends Tag implements ABCContainerTag { +public class DoABC2Tag extends Tag implements ABCContainerTag { public static final int ID = 82; - public static final String NAME = "DoABCDefine"; + public static final String NAME = "DoABC2"; /** * ActionScript 3 bytecodes @@ -71,7 +71,7 @@ public class DoABCDefineTag extends Tag implements ABCContainerTag { * * @param swf */ - public DoABCDefineTag(SWF swf) { + public DoABC2Tag(SWF swf) { super(swf, ID, NAME, null); name = "New DoABC"; abc = new ABC(this); @@ -84,7 +84,7 @@ public class DoABCDefineTag extends Tag implements ABCContainerTag { * @param data * @throws IOException */ - public DoABCDefineTag(SWFInputStream sis, ByteArrayRange data) throws IOException { + public DoABC2Tag(SWFInputStream sis, ByteArrayRange data) throws IOException { super(sis.getSwf(), ID, NAME, data); readData(sis, data, 0, false, false, false); } @@ -136,8 +136,8 @@ public class DoABCDefineTag extends Tag implements ABCContainerTag { @Override public int compareTo(ABCContainerTag o) { - if (o instanceof DoABCDefineTag) { - DoABCDefineTag n = (DoABCDefineTag) o; + if (o instanceof DoABC2Tag) { + DoABC2Tag n = (DoABC2Tag) o; int lastCmp = name.compareTo(n.name); return (lastCmp != 0 ? lastCmp : name.compareTo(n.name)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java index a4009c108..0016ed560 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/Tag.java @@ -226,7 +226,7 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { addTagInfo(map, map2, DefineText2Tag.ID, DefineText2Tag.class, DefineText2Tag.NAME); addTagInfo(map, map2, DefineTextTag.ID, DefineTextTag.class, DefineTextTag.NAME); addTagInfo(map, map2, DefineVideoStreamTag.ID, DefineVideoStreamTag.class, DefineVideoStreamTag.NAME); - addTagInfo(map, map2, DoABCDefineTag.ID, DoABCDefineTag.class, DoABCDefineTag.NAME); + addTagInfo(map, map2, DoABC2Tag.ID, DoABC2Tag.class, DoABC2Tag.NAME); addTagInfo(map, map2, DoABCTag.ID, DoABCTag.class, DoABCTag.NAME); addTagInfo(map, map2, DoActionTag.ID, DoActionTag.class, DoActionTag.NAME); addTagInfo(map, map2, DoInitActionTag.ID, DoInitActionTag.class, DoInitActionTag.NAME); @@ -330,7 +330,7 @@ public abstract class Tag implements NeedsCharacters, Exportable, Serializable { DefineText2Tag.ID, DefineTextTag.ID, DefineVideoStreamTag.ID, - DoABCDefineTag.ID, + DoABC2Tag.ID, DoABCTag.ID, DoActionTag.ID, DoInitActionTag.ID, diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java index 0e6e5c3cc..ab3aff734 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript3Test.java @@ -1,945 +1,945 @@ -/* - * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. - */ -package com.jpexs.decompiler.flash; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.configuration.Configuration; -import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; -import com.jpexs.decompiler.flash.helpers.CodeFormatting; -import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; -import com.jpexs.decompiler.flash.helpers.NulWriter; -import com.jpexs.decompiler.flash.tags.DoABCDefineTag; -import com.jpexs.decompiler.flash.tags.Tag; -import com.jpexs.decompiler.graph.ScopeStack; -import java.io.BufferedInputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -/** - * - * @author JPEXS - */ -public class ActionScript3Test extends ActionScriptTestBase { - - private SWF swf; - - private int clsIndex; - - private ABC abc; - - @BeforeClass - public void init() throws IOException, InterruptedException { - //Main.initLogging(false); - swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as3/as3.swf")), false); - DoABCDefineTag tag = null; - for (Tag t : swf.tags) { - if (t instanceof DoABCDefineTag) { - tag = (DoABCDefineTag) t; - break; - } - } - assertNotNull(tag); - clsIndex = tag.getABC().findClassByName("classes.Test"); - assertTrue(clsIndex > -1); - this.abc = tag.getABC(); - Configuration.autoDeobfuscate.set(false); - Configuration.decompile.set(true); - Configuration.registerNameFormat.set("_loc%d_"); - Configuration.showMethodBodyId.set(false); - } - - private void decompileMethod(String methodName, String expectedResult, boolean isStatic) { - int bodyIndex = abc.findMethodBodyByName(clsIndex, methodName); - assertTrue(bodyIndex > -1); - HighlightedTextWriter writer = null; - try { - abc.bodies.get(bodyIndex).convert(methodName, ScriptExportMode.AS, isStatic, -1/*FIX?*/, clsIndex, abc, null, abc.constants, abc.method_info, new ScopeStack(), false, new NulWriter(), new ArrayList<>(), abc.instance_info.get(clsIndex).instance_traits, true); - writer = new HighlightedTextWriter(new CodeFormatting(), false); - abc.bodies.get(bodyIndex).toString(methodName, ScriptExportMode.AS, abc, null, abc.constants, abc.method_info, writer, new ArrayList<>()); - } catch (InterruptedException ex) { - fail(); - } - String actualResult = cleanPCode(writer.toString()); - expectedResult = cleanPCode(expectedResult); - assertEquals(actualResult, expectedResult); - } - - @Test - public void testHello() { - decompileMethod("testHello", "trace(\"hello\");\r\n", false); - } - - @Test - public void testIncDec() { - decompileMethod("testIncDec", "var a:* = 5;\r\n" - + "var b:* = 0;\r\n" - + "trace(\"++var\");\r\n" - + "b = ++a;\r\n" - + "trace(\"var++\");\r\n" - + "b = a++;\r\n" - + "trace(\"--var\");\r\n" - + "b = --a;\r\n" - + "trace(\"var--\");\r\n" - + "b = a--;\r\n" - + "var c:* = [1,2,3,4,5];\r\n" - + "trace(\"++arr\");\r\n" - + "b = ++c[2];\r\n" - + "trace(\"arr++\");\r\n" - + "b = c[2]++;\r\n" - + "trace(\"--arr\");\r\n" - + "b = --c[2];\r\n" - + "trace(\"arr--\");\r\n" - + "b = c[2]--;\r\n" - + "var d:* = new TestClass1();\r\n" - + "trace(\"++property\");\r\n" - + "trace(++d.attrib);\r\n" - + "trace(\"property++\");\r\n" - + "trace(d.attrib++);\r\n" - + "trace(\"--property\");\r\n" - + "trace(--d.attrib);\r\n" - + "trace(\"property--\");\r\n" - + "trace(d.attrib--);\r\n" - + "trace(\"arr[e++]\");\r\n" - + "var chars:Array = new Array(36);\r\n" - + "var index:uint = 0;\r\n" - + "chars[index++] = 5;\r\n" - + "trace(\"arr[++e]\");\r\n" - + "chars[++index] = 5;\r\n", false); - } - - @Test - public void testDoWhile() { - decompileMethod("testDoWhile", "var a:* = 8;\r\n" - + "do\r\n" - + "{\r\n" - + "trace(\"a=\" + a);\r\n" - + "a++;\r\n" - + "}\r\n" - + "while(a < 20);\r\n" - + "\r\n", false); - } - - @Test - public void testInnerTry() { - decompileMethod("testInnerTry", "try\r\n" - + "{\r\n" - + "try\r\n" - + "{\r\n" - + "trace(\"try body 1\");\r\n" - + "}\r\n" - + "catch(e:DefinitionError)\r\n" - + "{\r\n" - + "trace(\"catched DefinitionError\");\r\n" - + "}\r\n" - + "trace(\"after try 1\");\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"catched Error\");\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"finally block\");\r\n" - + "}\r\n", false); - } - - @Test - public void testWhileContinue() { - decompileMethod("testWhileContinue", "var a:* = 5;\r\n" - + "while(true)\r\n" - + "{\r\n" - + "if(a == 9)\r\n" - + "{\r\n" - + "if(a == 8)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "if(a == 9)\r\n" - + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "trace(\"hello 1\");\r\n" - + "}\r\n" - + "trace(\"hello2\");\r\n" - + "}\r\n", false); - } - - @Test - public void testPrecedence() { - decompileMethod("testPrecedence", "var a:* = 0;\r\n" - + "a = (5 + 6) * 7;\r\n" - + "a = 5 * (2 + 3);\r\n" - + "a = 5 + 6 * 7;\r\n" - + "a = 5 * 2 + 2;\r\n" - + "a = 5 * (25 % 3);\r\n" - + "a = 5 % (24 * 307);\r\n" - + "a = 1 / (2 / 3);\r\n" - + "a = 1 / (2 * 3);\r\n" - + "a = 1 * 2 * 3;\r\n" - + "a = 1 * 2 / 3;\r\n" - + "trace(\"a=\" + a);\r\n", false); - } - - @Test - public void testStrings() { - decompileMethod("testStrings", "trace(\"hello\");\r\n" - + "trace(\"quotes:\\\"hello!\\\"\");\r\n" - + "trace(\"backslash: \\\\ \");\r\n" - + "trace(\"single quotes: \\'hello!\\'\");\r\n" - + "trace(\"new line \\r\\n hello!\");\r\n", false); - } - - @Test - public void testContinueLevels() { - decompileMethod("testContinueLevels", "var b:* = undefined;\r\n" - + "var c:* = undefined;\r\n" - + "var d:* = undefined;\r\n" - + "var e:* = undefined;\r\n" - + "var a:* = 5;\r\n" - + "loop3:\r\n" - + "switch(a)\r\n" - + "{\r\n" - + "case 57 * a:\r\n" - + "trace(\"fiftyseven multiply a\");\r\n" - + "b = 0;\r\n" - + "while(b < 50)\r\n" - + "{\r\n" - + "if(b == 10)\r\n" - + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "if(b == 15)\r\n" - + "{\r\n" - + "break loop3;\r\n" - + "}\r\n" - + "b = b + 1;\r\n" - + "}\r\n" - + "break;\r\n" - + "case 13:\r\n" - + "trace(\"thirteen\");\r\n" - + "case 14:\r\n" - + "trace(\"fourteen\");\r\n" - + "break;\r\n" - + "case 89:\r\n" - + "trace(\"eightynine\");\r\n" - + "break;\r\n" - + "default:\r\n" - + "trace(\"default clause\");\r\n" - + "}\r\n" - + "loop1:\r\n" - + "for(c = 0; c < 8; c = c + 1)\r\n" - + "{\r\n" - + "for(d = 0; d < 25; d++)\r\n" - + "{\r\n" - + "e = 0;\r\n" - + "if(e < 50)\r\n" - + "{\r\n" - + "if(e == 9)\r\n" - + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "if(e == 20)\r\n" - + "{\r\n" - + "continue loop1;\r\n" - + "}\r\n" - + "if(e != 8)\r\n" - + "{\r\n" - + "break loop1;\r\n" - + "}\r\n" - + "}\r\n" - + "}\r\n" - + "trace(\"hello\");\r\n" - + "}\r\n", false); - } - - @Test - public void testSwitchDefault() { - decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" - + "switch(a)\r\n" - + "{\r\n" - + "case 57 * a:\r\n" - + "trace(\"fiftyseven multiply a\");\r\n" - + "break;\r\n" - + "case 13:\r\n" - + "trace(\"thirteen\");\r\n" - + "case 14:\r\n" - + "trace(\"fourteen\");\r\n" - + "break;\r\n" - + "case 89:\r\n" - + "trace(\"eightynine\");\r\n" - + "break;\r\n" - + "default:\r\n" - + "trace(\"default clause\");\r\n" - + "}\r\n", false); - } - - @Test - public void testMultipleCondition() { - decompileMethod("testMultipleCondition", "var a:* = 5;\r\n" - + "var b:* = 8;\r\n" - + "var c:* = 9;\r\n" - + "if((a <= 4 || b <= 8) && c == 7)\r\n" - + "{\r\n" - + "trace(\"onTrue\");\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "trace(\"onFalse\");\r\n" - + "}\r\n", false); - } - - @Test - public void testForBreak() { - /*decompileMethod("testForBreak", "var a:* = 0;\r\n" - + "while(a < 10)\r\n" - + "{\r\n" - + "if(a == 5)\r\n" - + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "trace(\"hello:\" + a);\r\n" - + "a++;\r\n" - + "}\r\n", false);*/ - // Issue 842, recover for loops - decompileMethod("testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" - + "{\r\n" - + "if(a == 5)\r\n" - + "{\r\n" - + "break;\r\n" - + "}\r\n" - + "trace(\"hello:\" + a);\r\n" - + "}\r\n", false); - } - - @Test - public void testIf() { - decompileMethod("testIf", "var a:* = 5;\r\n" - + "if(a == 7)\r\n" - + "{\r\n" - + "trace(\"onTrue\");\r\n" - + "}\r\n", false); - } - - @Test - public void testIfElse() { - decompileMethod("testIfElse", "var a:* = 5;\r\n" - + "if(a == 7)\r\n" - + "{\r\n" - + "trace(\"onTrue\");\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "trace(\"onFalse\");\r\n" - + "}\r\n", false); - } - - @Test - public void testFor() { - decompileMethod("testFor", "for(var a:* = 0; a < 10; a++)\r\n" - + "{\r\n" - + "trace(\"a=\" + a);\r\n" - + "}\r\n", false); - } - - @Test - public void testForContinue() { - decompileMethod("testForContinue", "for(var a:* = 0; a < 10; a = a + 1)\r\n" - + "{\r\n" - + "if(a == 9)\r\n" - + "{\r\n" - + "if(a == 5)\r\n" - + "{\r\n" - + "trace(\"part1\");\r\n" - + "continue;\r\n" - + "}\r\n" - + "trace(\"a=\" + a);\r\n" - + "if(a == 7)\r\n" - + "{\r\n" - + "trace(\"part2\");\r\n" - + "continue;\r\n" - + "}\r\n" - + "trace(\"part3\");\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "trace(\"part4\");\r\n" - + "}\r\n" - + "trace(\"part5\");\r\n" - + "}\r\n", false); - } - - @Test - public void testTry() { - decompileMethod("testTry", "var i:int = 0;\r\n" - + "i = 7;\r\n" - + "try\r\n" - + "{\r\n" - + "trace(\"try body\");\r\n" - + "}\r\n" - + "catch(e:DefinitionError)\r\n" - + "{\r\n" - + "trace(\"catched DefinitionError\");\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"Error message:\" + e.message);\r\n" - + "trace(\"Stacktrace:\" + e.getStackTrace());\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"Finally part\");\r\n" - + "}\r\n" - + "trace(\"end\");\r\n", false); - } - - @Test - public void testSwitch() { - decompileMethod("testSwitch", "var a:* = 5;\r\n" - + "switch(a)\r\n" - + "{\r\n" - + "case 57 * a:\r\n" - + "trace(\"fiftyseven multiply a\");\r\n" - + "break;\r\n" - + "case 13:\r\n" - + "trace(\"thirteen\");\r\n" - + "case 14:\r\n" - + "trace(\"fourteen\");\r\n" - + "break;\r\n" - + "case 89:\r\n" - + "trace(\"eightynine\");\r\n" - + "break;\r\n" - + "}\r\n", false); - } - - @Test - public void testTernarOperator() { - decompileMethod("testTernarOperator", "var a:* = 5;\r\n" - + "var b:* = 4;\r\n" - + "var c:* = 4;\r\n" - + "var d:* = 78;\r\n" - + "var e:* = a == b?c == d?1:7:3;\r\n" - + "trace(\"e=\" + e);\r\n", false); - } - - @Test - public void testInnerIf() { - decompileMethod("testInnerIf", "var a:* = 5;\r\n" - + "var b:* = 4;\r\n" - + "if(a == 5)\r\n" - + "{\r\n" - + "if(b == 6)\r\n" - + "{\r\n" - + "trace(\"b==6\");\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "trace(\"b!=6\");\r\n" - + "}\r\n" - + "}\r\n" - + "else if(b == 7)\r\n" - + "{\r\n" - + "trace(\"b==7\");\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "trace(\"b!=7\");\r\n" - + "}\r\n" - + "\r\n" - + "trace(\"end\");\r\n", false); - } - - @Test - public void testVector() { - decompileMethod("testVector", "var v:Vector. = new Vector.();\r\n" - + "v.push(\"hello\");\r\n" - + "v[0] = \"hi\";\r\n" - + "v[5 * 8 - 39] = \"hi2\";\r\n" - + "trace(v[0]);\r\n", false); - } - - @Test - public void testProperty() { - decompileMethod("testProperty", "var d:* = new TestClass1();\r\n" - + "var k:* = 7 + 8;\r\n" - + "if(k == 15)\r\n" - + "{\r\n" - + "d.method(d.attrib * 5);\r\n" - + "}\r\n", false); - } - - @Test - public void testRest() { - decompileMethod("testRest", "trace(\"firstRest:\" + restval[0]);\r\n" - + "return firstp;\r\n", false); - } - - @Test - public void testParamNames() { - decompileMethod("testParamNames", "return firstp + secondp + thirdp;\r\n", false); - } - - @Test - public void testForEach() { - decompileMethod("testForEach", "var list:Array = null;\r\n" - + "var item:* = undefined;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "for each(item in list)\r\n" - + "{\r\n" - + "trace(\"item #\" + item);\r\n" - + "}\r\n", false); - } - - @Test - public void testForEachObjectArray() { - decompileMethod("testForEachObjectArray", "var list:Array = null;\r\n" - + "var test:Array = null;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "test = new Array();\r\n" - + "test[0] = 0;\r\n" - + "for each(test[0] in list)\r\n" - + "{\r\n" - + "trace(\"item #\" + test[0]);\r\n" - + "}\r\n", false); - } - - @Test - public void testForEachObjectAttribute() { - decompileMethod("testForEachObjectAttribute", "var list:Array = null;\r\n" - + "list = new Array();\r\n" - + "list[0] = \"first\";\r\n" - + "list[1] = \"second\";\r\n" - + "list[2] = \"third\";\r\n" - + "for each(this.testPriv in list)\r\n" - + "{\r\n" - + "trace(\"item #\" + this.testPriv);\r\n" - + "}\r\n", false); - } - - @Test - public void testParamsCount() { - decompileMethod("testParamsCount", "return firstp;\r\n", false); - } - - @Test - public void testInlineFunctions() { - decompileMethod("testInlineFunctions", "var first:String = null;\r\n" - + "first = \"value1\";\r\n" - + "var traceParameter:Function = function(aParam:String):String\r\n" - + "{\r\n" - + "var second:String = null;\r\n" - + "second = \"value2\";\r\n" - + "second = second + \"cc\";\r\n" - + "var traceParam2:Function = function(bParam:String):String\r\n" - + "{\r\n" - + "trace(bParam + \",\" + aParam);\r\n" - + "return first + second + aParam + bParam;\r\n" - + "};\r\n" - + "trace(second);\r\n" - + "traceParam2(aParam);\r\n" - + "return first;\r\n" - + "};\r\n" - + "traceParameter(\"hello\");\r\n", false); - } - - @Test - public void testMissingDefault() { - decompileMethod("testMissingDefault", "var jj:* = 1;\r\n" - + "switch(jj)\r\n" - + "{\r\n" - + "case 1:\r\n" - + "jj = 1;\r\n" - + "break;\r\n" - + "case 2:\r\n" - + "jj = 2;\r\n" - + "break;\r\n" - + "default:\r\n" - + "jj = 3;\r\n" - + "}\r\n", false); - } - - @Test - public void testChainedAssignments() { - decompileMethod("testChainedAssignments", "var a:* = 0;\r\n" - + "var b:* = 0;\r\n" - + "var c:* = 0;\r\n" - + "var d:* = 0;\r\n" - + "d = c = b = a = 5;\r\n" - + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" - + "e.attrib1 = e.attrib2 = e.attrib3 = this.getCounter();\r\n" - + "this.traceIt(e.toString());\r\n", false); - } - - @Test - public void testFinallyZeroJump() { - decompileMethod("testFinallyZeroJump", "var str:String = param1;\r\n" - + "try\r\n" - + "{\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "trace(\"error is :\" + e.message);\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"hi \");\r\n" - + "if(5 == 4)\r\n" - + "{\r\n" - + "return str;\r\n" - + "}\r\n" - + "return \"hu\" + str;\r\n" - + "}\r\n", false); - } - - @Test - public void testInnerFunctions() { - decompileMethod("testInnerFunctions", "var s:int = 0;\r\n" - + "var innerFunc:Function = function(b:String):*\r\n" - + "{\r\n" - + "trace(b);\r\n" - + "};\r\n" - + "var k:int = 5;\r\n" - + "if(k == 6)\r\n" - + "{\r\n" - + "s = 8;\r\n" - + "}\r\n" - + "innerFunc(a);\r\n", false); - } - - @Test - public void testDeclarations() { - decompileMethod("testDeclarations", "var vall:* = undefined;\r\n" - + "var vstr:String = null;\r\n" - + "var vint:* = 0;\r\n" - + "var vuint:uint = 0;\r\n" - + "var vclass:TestClass1 = null;\r\n" - + "var vnumber:* = NaN;\r\n" - + "var vobject:Object = null;\r\n" - + "vall = 6;\r\n" - + "vstr = \"hello\";\r\n" - + "vuint = 7;\r\n" - + "vint = -4;\r\n" - + "vclass = new TestClass1();\r\n" - + "vnumber = 0.5;\r\n" - + "vnumber = 6;\r\n" - + "vobject = vclass;\r\n", false); - } - - @Test - public void testForIn() { - decompileMethod("testForIn", "var dic:Dictionary = null;\r\n" - + "var item:Object = null;\r\n" - + "for(item in dic)\r\n" - + "{\r\n" - + "trace(item);\r\n" - + "}\r\n" - + "for each(item in dic)\r\n" - + "{\r\n" - + "trace(item);\r\n" - + "}\r\n", false); - } - - @Test - public void testNames() { - decompileMethod("testNames", "var ns:* = this.getNamespace();\r\n" - + "var name:* = this.getName();\r\n" - + "var a:* = ns::unnamespacedFunc();\r\n" - + "var b:* = ns::[name];\r\n" - + "trace(b.c);\r\n" - + "var c:* = myInternal::neco;\r\n", false); - } - - @Test - public void testComplexExpressions() { - decompileMethod("testComplexExpressions", "var i:* = 0;\r\n" - + "var j:* = 0;\r\n" - + "j = i = i + (i = i + i++);\r\n", false); - } - - @Test - public void testExpressions() { - decompileMethod("testExpressions", "var arr:Array = null;\r\n" - + "var i:* = 5;\r\n" - + "var j:* = 5;\r\n" - + "if((i = i = i / 2) == 1 || i == 2)\r\n" - + "{\r\n" - + "arguments.concat(i);\r\n" - + "}\r\n" - + "else if(i == 0)\r\n" - + "{\r\n" - + "i = j++;\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "arr[0]();\r\n" - + "}\r\n" - + "\r\n" - + "return i == 0;\r\n", false); - } - - @Test - public void testArguments() { - decompileMethod("testArguments", "return arguments[0];\r\n", false); - } - - @Test - public void testLogicalComputing() { - decompileMethod("testLogicalComputing", "var b:* = false;\r\n" - + "var i:* = 5;\r\n" - + "var j:* = 7;\r\n" - + "if(i > j)\r\n" - + "{\r\n" - + "j = 9;\r\n" - + "b = true;\r\n" - + "}\r\n" - + "b = (i == 0 || i == 1) && j == 0;\r\n", false); - } - - @Test - public void testInc2() { - decompileMethod("testInc2", "var a:* = [1];\r\n" - + "a[this.getInt()]++;\r\n" - + "var d:* = a[this.getInt()]++;\r\n" - + "var e:* = ++a[this.getInt()];\r\n" - + "var b:* = 1;\r\n" - + "b++;\r\n" - + "var c:* = 1;\r\n" - + "b = c++;\r\n", false); - } - - @Test - public void testDecl2() { - decompileMethod("testDecl2", "var k:* = 0;\r\n" - + "var i:* = 5;\r\n" - + "i = i + 7;\r\n" - + "if(i == 5)\r\n" - + "{\r\n" - + "if(i < 8)\r\n" - + "{\r\n" - + "k = 6;\r\n" - + "}\r\n" - + "}\r\n" - + "k = 7;\r\n", false); - } - - @Test - public void testChain2() { - decompileMethod("testChain2", "var g:Array = null;\r\n" - + "var h:* = false;\r\n" - + "var extraLine:* = false;\r\n" - + "var r:* = 7;\r\n" - + "var t:* = 0;\r\n" - + "t = this.getInt();\r\n" - + "if(t + 1 < g.length)\r\n" - + "{\r\n" - + "t++;\r\n" - + "h = true;\r\n" - + "}\r\n" - + "if(t >= 0)\r\n" - + "{\r\n" - + "trace(\"ch\");\r\n" - + "}\r\n", false); - } - - @Test - public void testDoWhile2() { - decompileMethod("testDoWhile2", "var k:* = 5;\r\n" - + "do\r\n" - + "{\r\n" - + "k++;\r\n" - + "if(k == 7)\r\n" - + "{\r\n" - + "k = 5 * k;\r\n" - + "}\r\n" - + "else\r\n" - + "{\r\n" - + "k = 5 - k;\r\n" - + "}\r\n" - + "k--;\r\n" - + "}\r\n" - + "while(k < 9);\r\n" - + "\r\n" - + "return 2;\r\n", false); - } - - @Test - public void testWhileAnd() { - decompileMethod("testWhileAnd", "var a:* = 5;\r\n" - + "var b:* = 10;\r\n" - + "while(a < 10 && b > 1)\r\n" - + "{\r\n" - + "a++;\r\n" - + "b--;\r\n" - + "}\r\n" - + "a = 7;\r\n" - + "b = 9;\r\n", false); - } - - @Test - public void testNamedAnonFunctions() { - decompileMethod("testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" - + "{\r\n" - + "return (param1 as TestClass2).attrib1 == 5;\r\n" - + "};\r\n", false); - } - - @Test - public void testStringConcat() { - decompileMethod("testStringConcat", "var k:* = 8;\r\n" - + "this.traceIt(\"hello\" + 5 * 6);\r\n" - + "this.traceIt(\"hello\" + (k - 1));\r\n" - + "this.traceIt(\"hello\" + 5 + 6);\r\n", false); - } - - @Test - public void testWhileTry() { - decompileMethod("testWhileTry", "while(true)\r\n" - + "{\r\n" - + "try\r\n" - + "{\r\n" - + "while(true)\r\n" - + "{\r\n" - + "trace(\"a\");\r\n" - + "}\r\n" - + "}\r\n" - + "catch(e:EOFError)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "}\r\n", false); - } - - @Test - public void testWhileTry2() { - decompileMethod("testWhileTry2", "var j:* = undefined;\r\n" - + "for(var i:* = 0; i < 100; i++)\r\n" - + "{\r\n" - + "try\r\n" - + "{\r\n" - + "for(j = 0; j < 20; j++)\r\n" - + "{\r\n" - + "trace(\"a\");\r\n" - + "}\r\n" - + "}\r\n" - + "catch(e:EOFError)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "continue;\r\n" - + "}\r\n" - + "trace(\"after_try\");\r\n" - + "}\r\n" - + "trace(\"end\");\r\n", false); - } - - @Test - public void testTryReturn() { - decompileMethod("testTryReturn", "var i:int = 0;\r\n" - + "var b:Boolean = false;\r\n" - + "try\r\n" - + "{\r\n" - + "i = 0;\r\n" - + "b = true;\r\n" - + "if(i > 0)\r\n" - + "{\r\n" - + "while(this.testDoWhile2())\r\n" - + "{\r\n" - + "if(b)\r\n" - + "{\r\n" - + "return 5;\r\n" - + "}\r\n" - + "}\r\n" - + "}\r\n" - + "i++;\r\n" - + "return 2;\r\n" - + "}\r\n" - + "catch(e:Error)\r\n" - + "{\r\n" - + "}\r\n" - + "return 4;\r\n", false); - } - - @Test - public void testVector2() { - decompileMethod("testVector2", "var a:Vector.> = new Vector.>();\r\n" - + "var b:Vector. = new [10,20,30];\r\n", false); - } - - public void testFinallyOnly() { - decompileMethod("testFinallyOnly", "var a:* = 5;\r\n" - + "try\r\n" - + "{\r\n" - + "a = 9;\r\n" - + "trace(\"intry\");\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"infinally\");\r\n" - + "}\r\n", false); - } - - @Test - public void testCatchFinally() { - decompileMethod("testCatchFinally", "var a:* = 5;\r\n" - + "try\r\n" - + "{\r\n" - + "a = 9;\r\n" - + "trace(\"intry\");\r\n" - + "}\r\n" - + "catch(e:*)\r\n" - + "{\r\n" - + "trace(\"incatch\");\r\n" - + "}\r\n" - + "finally\r\n" - + "{\r\n" - + "trace(\"infinally\");\r\n" - + "}\r\n", false); - } - - @Test - public void testOptionalParameters() { - String methodName = "testOptionalParameters"; - int methodInfo = abc.findMethodInfoByName(clsIndex, methodName); - int bodyIndex = abc.findMethodBodyByName(clsIndex, methodName); - assertTrue(methodInfo > -1); - assertTrue(bodyIndex > -1); - HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); - abc.method_info.get(methodInfo).getParamStr(writer, abc.constants, abc.bodies.get(bodyIndex), abc, new ArrayList<>()); - String actualResult = writer.toString().replaceAll("[ \r\n]", ""); - String expectedResult = "p1:Event=null,p2:Number=1,p3:Number=-1,p4:Number=-1.1,p5:Number=-1.1,p6:String=\"a\""; - expectedResult = expectedResult.replaceAll("[ \r\n]", ""); - assertEquals(actualResult, expectedResult); - } -} +/* + * Copyright (C) 2010-2015 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.helpers.NulWriter; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.graph.ScopeStack; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript3Test extends ActionScriptTestBase { + + private SWF swf; + + private int clsIndex; + + private ABC abc; + + @BeforeClass + public void init() throws IOException, InterruptedException { + //Main.initLogging(false); + swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as3/as3.swf")), false); + DoABC2Tag tag = null; + for (Tag t : swf.tags) { + if (t instanceof DoABC2Tag) { + tag = (DoABC2Tag) t; + break; + } + } + assertNotNull(tag); + clsIndex = tag.getABC().findClassByName("classes.Test"); + assertTrue(clsIndex > -1); + this.abc = tag.getABC(); + Configuration.autoDeobfuscate.set(false); + Configuration.decompile.set(true); + Configuration.registerNameFormat.set("_loc%d_"); + Configuration.showMethodBodyId.set(false); + } + + private void decompileMethod(String methodName, String expectedResult, boolean isStatic) { + int bodyIndex = abc.findMethodBodyByName(clsIndex, methodName); + assertTrue(bodyIndex > -1); + HighlightedTextWriter writer = null; + try { + abc.bodies.get(bodyIndex).convert(methodName, ScriptExportMode.AS, isStatic, -1/*FIX?*/, clsIndex, abc, null, abc.constants, abc.method_info, new ScopeStack(), false, new NulWriter(), new ArrayList<>(), abc.instance_info.get(clsIndex).instance_traits, true); + writer = new HighlightedTextWriter(new CodeFormatting(), false); + abc.bodies.get(bodyIndex).toString(methodName, ScriptExportMode.AS, abc, null, abc.constants, abc.method_info, writer, new ArrayList<>()); + } catch (InterruptedException ex) { + fail(); + } + String actualResult = cleanPCode(writer.toString()); + expectedResult = cleanPCode(expectedResult); + assertEquals(actualResult, expectedResult); + } + + @Test + public void testHello() { + decompileMethod("testHello", "trace(\"hello\");\r\n", false); + } + + @Test + public void testIncDec() { + decompileMethod("testIncDec", "var a:* = 5;\r\n" + + "var b:* = 0;\r\n" + + "trace(\"++var\");\r\n" + + "b = ++a;\r\n" + + "trace(\"var++\");\r\n" + + "b = a++;\r\n" + + "trace(\"--var\");\r\n" + + "b = --a;\r\n" + + "trace(\"var--\");\r\n" + + "b = a--;\r\n" + + "var c:* = [1,2,3,4,5];\r\n" + + "trace(\"++arr\");\r\n" + + "b = ++c[2];\r\n" + + "trace(\"arr++\");\r\n" + + "b = c[2]++;\r\n" + + "trace(\"--arr\");\r\n" + + "b = --c[2];\r\n" + + "trace(\"arr--\");\r\n" + + "b = c[2]--;\r\n" + + "var d:* = new TestClass1();\r\n" + + "trace(\"++property\");\r\n" + + "trace(++d.attrib);\r\n" + + "trace(\"property++\");\r\n" + + "trace(d.attrib++);\r\n" + + "trace(\"--property\");\r\n" + + "trace(--d.attrib);\r\n" + + "trace(\"property--\");\r\n" + + "trace(d.attrib--);\r\n" + + "trace(\"arr[e++]\");\r\n" + + "var chars:Array = new Array(36);\r\n" + + "var index:uint = 0;\r\n" + + "chars[index++] = 5;\r\n" + + "trace(\"arr[++e]\");\r\n" + + "chars[++index] = 5;\r\n", false); + } + + @Test + public void testDoWhile() { + decompileMethod("testDoWhile", "var a:* = 8;\r\n" + + "do\r\n" + + "{\r\n" + + "trace(\"a=\" + a);\r\n" + + "a++;\r\n" + + "}\r\n" + + "while(a < 20);\r\n" + + "\r\n", false); + } + + @Test + public void testInnerTry() { + decompileMethod("testInnerTry", "try\r\n" + + "{\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"try body 1\");\r\n" + + "}\r\n" + + "catch(e:DefinitionError)\r\n" + + "{\r\n" + + "trace(\"catched DefinitionError\");\r\n" + + "}\r\n" + + "trace(\"after try 1\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"catched Error\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"finally block\");\r\n" + + "}\r\n", false); + } + + @Test + public void testWhileContinue() { + decompileMethod("testWhileContinue", "var a:* = 5;\r\n" + + "while(true)\r\n" + + "{\r\n" + + "if(a == 9)\r\n" + + "{\r\n" + + "if(a == 8)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "if(a == 9)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello 1\");\r\n" + + "}\r\n" + + "trace(\"hello2\");\r\n" + + "}\r\n", false); + } + + @Test + public void testPrecedence() { + decompileMethod("testPrecedence", "var a:* = 0;\r\n" + + "a = (5 + 6) * 7;\r\n" + + "a = 5 * (2 + 3);\r\n" + + "a = 5 + 6 * 7;\r\n" + + "a = 5 * 2 + 2;\r\n" + + "a = 5 * (25 % 3);\r\n" + + "a = 5 % (24 * 307);\r\n" + + "a = 1 / (2 / 3);\r\n" + + "a = 1 / (2 * 3);\r\n" + + "a = 1 * 2 * 3;\r\n" + + "a = 1 * 2 / 3;\r\n" + + "trace(\"a=\" + a);\r\n", false); + } + + @Test + public void testStrings() { + decompileMethod("testStrings", "trace(\"hello\");\r\n" + + "trace(\"quotes:\\\"hello!\\\"\");\r\n" + + "trace(\"backslash: \\\\ \");\r\n" + + "trace(\"single quotes: \\'hello!\\'\");\r\n" + + "trace(\"new line \\r\\n hello!\");\r\n", false); + } + + @Test + public void testContinueLevels() { + decompileMethod("testContinueLevels", "var b:* = undefined;\r\n" + + "var c:* = undefined;\r\n" + + "var d:* = undefined;\r\n" + + "var e:* = undefined;\r\n" + + "var a:* = 5;\r\n" + + "loop3:\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57 * a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "b = 0;\r\n" + + "while(b < 50)\r\n" + + "{\r\n" + + "if(b == 10)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "if(b == 15)\r\n" + + "{\r\n" + + "break loop3;\r\n" + + "}\r\n" + + "b = b + 1;\r\n" + + "}\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"default clause\");\r\n" + + "}\r\n" + + "loop1:\r\n" + + "for(c = 0; c < 8; c = c + 1)\r\n" + + "{\r\n" + + "for(d = 0; d < 25; d++)\r\n" + + "{\r\n" + + "e = 0;\r\n" + + "if(e < 50)\r\n" + + "{\r\n" + + "if(e == 9)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "if(e == 20)\r\n" + + "{\r\n" + + "continue loop1;\r\n" + + "}\r\n" + + "if(e != 8)\r\n" + + "{\r\n" + + "break loop1;\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "trace(\"hello\");\r\n" + + "}\r\n", false); + } + + @Test + public void testSwitchDefault() { + decompileMethod("testSwitchDefault", "var a:* = 5;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57 * a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"default clause\");\r\n" + + "}\r\n", false); + } + + @Test + public void testMultipleCondition() { + decompileMethod("testMultipleCondition", "var a:* = 5;\r\n" + + "var b:* = 8;\r\n" + + "var c:* = 9;\r\n" + + "if((a <= 4 || b <= 8) && c == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", false); + } + + @Test + public void testForBreak() { + /*decompileMethod("testForBreak", "var a:* = 0;\r\n" + + "while(a < 10)\r\n" + + "{\r\n" + + "if(a == 5)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello:\" + a);\r\n" + + "a++;\r\n" + + "}\r\n", false);*/ + // Issue 842, recover for loops + decompileMethod("testForBreak", "for(var a:* = 0; a < 10; a++)\r\n" + + "{\r\n" + + "if(a == 5)\r\n" + + "{\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello:\" + a);\r\n" + + "}\r\n", false); + } + + @Test + public void testIf() { + decompileMethod("testIf", "var a:* = 5;\r\n" + + "if(a == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n", false); + } + + @Test + public void testIfElse() { + decompileMethod("testIfElse", "var a:* = 5;\r\n" + + "if(a == 7)\r\n" + + "{\r\n" + + "trace(\"onTrue\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"onFalse\");\r\n" + + "}\r\n", false); + } + + @Test + public void testFor() { + decompileMethod("testFor", "for(var a:* = 0; a < 10; a++)\r\n" + + "{\r\n" + + "trace(\"a=\" + a);\r\n" + + "}\r\n", false); + } + + @Test + public void testForContinue() { + decompileMethod("testForContinue", "for(var a:* = 0; a < 10; a = a + 1)\r\n" + + "{\r\n" + + "if(a == 9)\r\n" + + "{\r\n" + + "if(a == 5)\r\n" + + "{\r\n" + + "trace(\"part1\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"a=\" + a);\r\n" + + "if(a == 7)\r\n" + + "{\r\n" + + "trace(\"part2\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"part3\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"part4\");\r\n" + + "}\r\n" + + "trace(\"part5\");\r\n" + + "}\r\n", false); + } + + @Test + public void testTry() { + decompileMethod("testTry", "var i:int = 0;\r\n" + + "i = 7;\r\n" + + "try\r\n" + + "{\r\n" + + "trace(\"try body\");\r\n" + + "}\r\n" + + "catch(e:DefinitionError)\r\n" + + "{\r\n" + + "trace(\"catched DefinitionError\");\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"Error message:\" + e.message);\r\n" + + "trace(\"Stacktrace:\" + e.getStackTrace());\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"Finally part\");\r\n" + + "}\r\n" + + "trace(\"end\");\r\n", false); + } + + @Test + public void testSwitch() { + decompileMethod("testSwitch", "var a:* = 5;\r\n" + + "switch(a)\r\n" + + "{\r\n" + + "case 57 * a:\r\n" + + "trace(\"fiftyseven multiply a\");\r\n" + + "break;\r\n" + + "case 13:\r\n" + + "trace(\"thirteen\");\r\n" + + "case 14:\r\n" + + "trace(\"fourteen\");\r\n" + + "break;\r\n" + + "case 89:\r\n" + + "trace(\"eightynine\");\r\n" + + "break;\r\n" + + "}\r\n", false); + } + + @Test + public void testTernarOperator() { + decompileMethod("testTernarOperator", "var a:* = 5;\r\n" + + "var b:* = 4;\r\n" + + "var c:* = 4;\r\n" + + "var d:* = 78;\r\n" + + "var e:* = a == b?c == d?1:7:3;\r\n" + + "trace(\"e=\" + e);\r\n", false); + } + + @Test + public void testInnerIf() { + decompileMethod("testInnerIf", "var a:* = 5;\r\n" + + "var b:* = 4;\r\n" + + "if(a == 5)\r\n" + + "{\r\n" + + "if(b == 6)\r\n" + + "{\r\n" + + "trace(\"b==6\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"b!=6\");\r\n" + + "}\r\n" + + "}\r\n" + + "else if(b == 7)\r\n" + + "{\r\n" + + "trace(\"b==7\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"b!=7\");\r\n" + + "}\r\n" + + "\r\n" + + "trace(\"end\");\r\n", false); + } + + @Test + public void testVector() { + decompileMethod("testVector", "var v:Vector. = new Vector.();\r\n" + + "v.push(\"hello\");\r\n" + + "v[0] = \"hi\";\r\n" + + "v[5 * 8 - 39] = \"hi2\";\r\n" + + "trace(v[0]);\r\n", false); + } + + @Test + public void testProperty() { + decompileMethod("testProperty", "var d:* = new TestClass1();\r\n" + + "var k:* = 7 + 8;\r\n" + + "if(k == 15)\r\n" + + "{\r\n" + + "d.method(d.attrib * 5);\r\n" + + "}\r\n", false); + } + + @Test + public void testRest() { + decompileMethod("testRest", "trace(\"firstRest:\" + restval[0]);\r\n" + + "return firstp;\r\n", false); + } + + @Test + public void testParamNames() { + decompileMethod("testParamNames", "return firstp + secondp + thirdp;\r\n", false); + } + + @Test + public void testForEach() { + decompileMethod("testForEach", "var list:Array = null;\r\n" + + "var item:* = undefined;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "for each(item in list)\r\n" + + "{\r\n" + + "trace(\"item #\" + item);\r\n" + + "}\r\n", false); + } + + @Test + public void testForEachObjectArray() { + decompileMethod("testForEachObjectArray", "var list:Array = null;\r\n" + + "var test:Array = null;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "test = new Array();\r\n" + + "test[0] = 0;\r\n" + + "for each(test[0] in list)\r\n" + + "{\r\n" + + "trace(\"item #\" + test[0]);\r\n" + + "}\r\n", false); + } + + @Test + public void testForEachObjectAttribute() { + decompileMethod("testForEachObjectAttribute", "var list:Array = null;\r\n" + + "list = new Array();\r\n" + + "list[0] = \"first\";\r\n" + + "list[1] = \"second\";\r\n" + + "list[2] = \"third\";\r\n" + + "for each(this.testPriv in list)\r\n" + + "{\r\n" + + "trace(\"item #\" + this.testPriv);\r\n" + + "}\r\n", false); + } + + @Test + public void testParamsCount() { + decompileMethod("testParamsCount", "return firstp;\r\n", false); + } + + @Test + public void testInlineFunctions() { + decompileMethod("testInlineFunctions", "var first:String = null;\r\n" + + "first = \"value1\";\r\n" + + "var traceParameter:Function = function(aParam:String):String\r\n" + + "{\r\n" + + "var second:String = null;\r\n" + + "second = \"value2\";\r\n" + + "second = second + \"cc\";\r\n" + + "var traceParam2:Function = function(bParam:String):String\r\n" + + "{\r\n" + + "trace(bParam + \",\" + aParam);\r\n" + + "return first + second + aParam + bParam;\r\n" + + "};\r\n" + + "trace(second);\r\n" + + "traceParam2(aParam);\r\n" + + "return first;\r\n" + + "};\r\n" + + "traceParameter(\"hello\");\r\n", false); + } + + @Test + public void testMissingDefault() { + decompileMethod("testMissingDefault", "var jj:* = 1;\r\n" + + "switch(jj)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "jj = 1;\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "jj = 2;\r\n" + + "break;\r\n" + + "default:\r\n" + + "jj = 3;\r\n" + + "}\r\n", false); + } + + @Test + public void testChainedAssignments() { + decompileMethod("testChainedAssignments", "var a:* = 0;\r\n" + + "var b:* = 0;\r\n" + + "var c:* = 0;\r\n" + + "var d:* = 0;\r\n" + + "d = c = b = a = 5;\r\n" + + "var e:TestClass2 = TestClass2.createMe(\"test\");\r\n" + + "e.attrib1 = e.attrib2 = e.attrib3 = this.getCounter();\r\n" + + "this.traceIt(e.toString());\r\n", false); + } + + @Test + public void testFinallyZeroJump() { + decompileMethod("testFinallyZeroJump", "var str:String = param1;\r\n" + + "try\r\n" + + "{\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "trace(\"error is :\" + e.message);\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"hi \");\r\n" + + "if(5 == 4)\r\n" + + "{\r\n" + + "return str;\r\n" + + "}\r\n" + + "return \"hu\" + str;\r\n" + + "}\r\n", false); + } + + @Test + public void testInnerFunctions() { + decompileMethod("testInnerFunctions", "var s:int = 0;\r\n" + + "var innerFunc:Function = function(b:String):*\r\n" + + "{\r\n" + + "trace(b);\r\n" + + "};\r\n" + + "var k:int = 5;\r\n" + + "if(k == 6)\r\n" + + "{\r\n" + + "s = 8;\r\n" + + "}\r\n" + + "innerFunc(a);\r\n", false); + } + + @Test + public void testDeclarations() { + decompileMethod("testDeclarations", "var vall:* = undefined;\r\n" + + "var vstr:String = null;\r\n" + + "var vint:* = 0;\r\n" + + "var vuint:uint = 0;\r\n" + + "var vclass:TestClass1 = null;\r\n" + + "var vnumber:* = NaN;\r\n" + + "var vobject:Object = null;\r\n" + + "vall = 6;\r\n" + + "vstr = \"hello\";\r\n" + + "vuint = 7;\r\n" + + "vint = -4;\r\n" + + "vclass = new TestClass1();\r\n" + + "vnumber = 0.5;\r\n" + + "vnumber = 6;\r\n" + + "vobject = vclass;\r\n", false); + } + + @Test + public void testForIn() { + decompileMethod("testForIn", "var dic:Dictionary = null;\r\n" + + "var item:Object = null;\r\n" + + "for(item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n" + + "for each(item in dic)\r\n" + + "{\r\n" + + "trace(item);\r\n" + + "}\r\n", false); + } + + @Test + public void testNames() { + decompileMethod("testNames", "var ns:* = this.getNamespace();\r\n" + + "var name:* = this.getName();\r\n" + + "var a:* = ns::unnamespacedFunc();\r\n" + + "var b:* = ns::[name];\r\n" + + "trace(b.c);\r\n" + + "var c:* = myInternal::neco;\r\n", false); + } + + @Test + public void testComplexExpressions() { + decompileMethod("testComplexExpressions", "var i:* = 0;\r\n" + + "var j:* = 0;\r\n" + + "j = i = i + (i = i + i++);\r\n", false); + } + + @Test + public void testExpressions() { + decompileMethod("testExpressions", "var arr:Array = null;\r\n" + + "var i:* = 5;\r\n" + + "var j:* = 5;\r\n" + + "if((i = i = i / 2) == 1 || i == 2)\r\n" + + "{\r\n" + + "arguments.concat(i);\r\n" + + "}\r\n" + + "else if(i == 0)\r\n" + + "{\r\n" + + "i = j++;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "arr[0]();\r\n" + + "}\r\n" + + "\r\n" + + "return i == 0;\r\n", false); + } + + @Test + public void testArguments() { + decompileMethod("testArguments", "return arguments[0];\r\n", false); + } + + @Test + public void testLogicalComputing() { + decompileMethod("testLogicalComputing", "var b:* = false;\r\n" + + "var i:* = 5;\r\n" + + "var j:* = 7;\r\n" + + "if(i > j)\r\n" + + "{\r\n" + + "j = 9;\r\n" + + "b = true;\r\n" + + "}\r\n" + + "b = (i == 0 || i == 1) && j == 0;\r\n", false); + } + + @Test + public void testInc2() { + decompileMethod("testInc2", "var a:* = [1];\r\n" + + "a[this.getInt()]++;\r\n" + + "var d:* = a[this.getInt()]++;\r\n" + + "var e:* = ++a[this.getInt()];\r\n" + + "var b:* = 1;\r\n" + + "b++;\r\n" + + "var c:* = 1;\r\n" + + "b = c++;\r\n", false); + } + + @Test + public void testDecl2() { + decompileMethod("testDecl2", "var k:* = 0;\r\n" + + "var i:* = 5;\r\n" + + "i = i + 7;\r\n" + + "if(i == 5)\r\n" + + "{\r\n" + + "if(i < 8)\r\n" + + "{\r\n" + + "k = 6;\r\n" + + "}\r\n" + + "}\r\n" + + "k = 7;\r\n", false); + } + + @Test + public void testChain2() { + decompileMethod("testChain2", "var g:Array = null;\r\n" + + "var h:* = false;\r\n" + + "var extraLine:* = false;\r\n" + + "var r:* = 7;\r\n" + + "var t:* = 0;\r\n" + + "t = this.getInt();\r\n" + + "if(t + 1 < g.length)\r\n" + + "{\r\n" + + "t++;\r\n" + + "h = true;\r\n" + + "}\r\n" + + "if(t >= 0)\r\n" + + "{\r\n" + + "trace(\"ch\");\r\n" + + "}\r\n", false); + } + + @Test + public void testDoWhile2() { + decompileMethod("testDoWhile2", "var k:* = 5;\r\n" + + "do\r\n" + + "{\r\n" + + "k++;\r\n" + + "if(k == 7)\r\n" + + "{\r\n" + + "k = 5 * k;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "k = 5 - k;\r\n" + + "}\r\n" + + "k--;\r\n" + + "}\r\n" + + "while(k < 9);\r\n" + + "\r\n" + + "return 2;\r\n", false); + } + + @Test + public void testWhileAnd() { + decompileMethod("testWhileAnd", "var a:* = 5;\r\n" + + "var b:* = 10;\r\n" + + "while(a < 10 && b > 1)\r\n" + + "{\r\n" + + "a++;\r\n" + + "b--;\r\n" + + "}\r\n" + + "a = 7;\r\n" + + "b = 9;\r\n", false); + } + + @Test + public void testNamedAnonFunctions() { + decompileMethod("testNamedAnonFunctions", "var test:* = new function testFunc(param1:*, param2:int, param3:Array):Boolean\r\n" + + "{\r\n" + + "return (param1 as TestClass2).attrib1 == 5;\r\n" + + "};\r\n", false); + } + + @Test + public void testStringConcat() { + decompileMethod("testStringConcat", "var k:* = 8;\r\n" + + "this.traceIt(\"hello\" + 5 * 6);\r\n" + + "this.traceIt(\"hello\" + (k - 1));\r\n" + + "this.traceIt(\"hello\" + 5 + 6);\r\n", false); + } + + @Test + public void testWhileTry() { + decompileMethod("testWhileTry", "while(true)\r\n" + + "{\r\n" + + "try\r\n" + + "{\r\n" + + "while(true)\r\n" + + "{\r\n" + + "trace(\"a\");\r\n" + + "}\r\n" + + "}\r\n" + + "catch(e:EOFError)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "}\r\n", false); + } + + @Test + public void testWhileTry2() { + decompileMethod("testWhileTry2", "var j:* = undefined;\r\n" + + "for(var i:* = 0; i < 100; i++)\r\n" + + "{\r\n" + + "try\r\n" + + "{\r\n" + + "for(j = 0; j < 20; j++)\r\n" + + "{\r\n" + + "trace(\"a\");\r\n" + + "}\r\n" + + "}\r\n" + + "catch(e:EOFError)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "continue;\r\n" + + "}\r\n" + + "trace(\"after_try\");\r\n" + + "}\r\n" + + "trace(\"end\");\r\n", false); + } + + @Test + public void testTryReturn() { + decompileMethod("testTryReturn", "var i:int = 0;\r\n" + + "var b:Boolean = false;\r\n" + + "try\r\n" + + "{\r\n" + + "i = 0;\r\n" + + "b = true;\r\n" + + "if(i > 0)\r\n" + + "{\r\n" + + "while(this.testDoWhile2())\r\n" + + "{\r\n" + + "if(b)\r\n" + + "{\r\n" + + "return 5;\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "i++;\r\n" + + "return 2;\r\n" + + "}\r\n" + + "catch(e:Error)\r\n" + + "{\r\n" + + "}\r\n" + + "return 4;\r\n", false); + } + + @Test + public void testVector2() { + decompileMethod("testVector2", "var a:Vector.> = new Vector.>();\r\n" + + "var b:Vector. = new [10,20,30];\r\n", false); + } + + public void testFinallyOnly() { + decompileMethod("testFinallyOnly", "var a:* = 5;\r\n" + + "try\r\n" + + "{\r\n" + + "a = 9;\r\n" + + "trace(\"intry\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"infinally\");\r\n" + + "}\r\n", false); + } + + @Test + public void testCatchFinally() { + decompileMethod("testCatchFinally", "var a:* = 5;\r\n" + + "try\r\n" + + "{\r\n" + + "a = 9;\r\n" + + "trace(\"intry\");\r\n" + + "}\r\n" + + "catch(e:*)\r\n" + + "{\r\n" + + "trace(\"incatch\");\r\n" + + "}\r\n" + + "finally\r\n" + + "{\r\n" + + "trace(\"infinally\");\r\n" + + "}\r\n", false); + } + + @Test + public void testOptionalParameters() { + String methodName = "testOptionalParameters"; + int methodInfo = abc.findMethodInfoByName(clsIndex, methodName); + int bodyIndex = abc.findMethodBodyByName(clsIndex, methodName); + assertTrue(methodInfo > -1); + assertTrue(bodyIndex > -1); + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + abc.method_info.get(methodInfo).getParamStr(writer, abc.constants, abc.bodies.get(bodyIndex), abc, new ArrayList<>()); + String actualResult = writer.toString().replaceAll("[ \r\n]", ""); + String expectedResult = "p1:Event=null,p2:Number=1,p3:Number=-1,p4:Number=-1.1,p5:Number=-1.1,p6:String=\"a\""; + expectedResult = expectedResult.replaceAll("[ \r\n]", ""); + assertEquals(actualResult, expectedResult); + } +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS2Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS2Generator.java index 45866ab8d..6c9ef9425 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS2Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS2Generator.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.generators; import com.jpexs.decompiler.flash.SWF; @@ -20,7 +21,7 @@ import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.helpers.CodeFormatting; import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; -import com.jpexs.decompiler.flash.tags.DoABCDefineTag; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; import com.jpexs.decompiler.flash.tags.DoActionTag; import com.jpexs.decompiler.flash.tags.ShowFrameTag; import com.jpexs.decompiler.flash.tags.Tag; @@ -40,7 +41,7 @@ public class AS2Generator { public static void main(String[] args) throws Exception { Configuration.autoDeobfuscate.set(false); SWF swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as2/as2.swf")), false); - DoABCDefineTag tag = null; + DoABC2Tag tag = null; DoActionTag doa = null; int frame = 0; StringBuilder s = new StringBuilder(); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java index 2a6860881..677d755b9 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/AS3Generator.java @@ -26,7 +26,7 @@ import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.helpers.CodeFormatting; import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; -import com.jpexs.decompiler.flash.tags.DoABCDefineTag; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.graph.ScopeStack; import java.io.BufferedInputStream; @@ -45,10 +45,10 @@ public class AS3Generator { public static void main(String[] args) throws Exception { Configuration.autoDeobfuscate.set(false); SWF swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as3/as3.swf")), false); - DoABCDefineTag tag = null; + DoABC2Tag tag = null; for (Tag t : swf.tags) { - if (t instanceof DoABCDefineTag) { - tag = (DoABCDefineTag) t; + if (t instanceof DoABC2Tag) { + tag = (DoABC2Tag) t; break; } } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagIdClassMap.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagIdClassMap.java index e20869122..ca6b0b8ca 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagIdClassMap.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagIdClassMap.java @@ -1,205 +1,205 @@ -/* - * Copyright (C) 2010-2015 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.tagtree; - -import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; -import com.jpexs.decompiler.flash.tags.DebugIDTag; -import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag; -import com.jpexs.decompiler.flash.tags.DefineBitsTag; -import com.jpexs.decompiler.flash.tags.DefineButton2Tag; -import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag; -import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag; -import com.jpexs.decompiler.flash.tags.DefineButtonTag; -import com.jpexs.decompiler.flash.tags.DefineEditTextTag; -import com.jpexs.decompiler.flash.tags.DefineFont2Tag; -import com.jpexs.decompiler.flash.tags.DefineFont3Tag; -import com.jpexs.decompiler.flash.tags.DefineFont4Tag; -import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag; -import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag; -import com.jpexs.decompiler.flash.tags.DefineFontInfoTag; -import com.jpexs.decompiler.flash.tags.DefineFontNameTag; -import com.jpexs.decompiler.flash.tags.DefineFontTag; -import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag; -import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag; -import com.jpexs.decompiler.flash.tags.DefineScalingGridTag; -import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag; -import com.jpexs.decompiler.flash.tags.DefineShape2Tag; -import com.jpexs.decompiler.flash.tags.DefineShape3Tag; -import com.jpexs.decompiler.flash.tags.DefineShape4Tag; -import com.jpexs.decompiler.flash.tags.DefineShapeTag; -import com.jpexs.decompiler.flash.tags.DefineSoundTag; -import com.jpexs.decompiler.flash.tags.DefineSpriteTag; -import com.jpexs.decompiler.flash.tags.DefineText2Tag; -import com.jpexs.decompiler.flash.tags.DefineTextTag; -import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; -import com.jpexs.decompiler.flash.tags.DoABCDefineTag; -import com.jpexs.decompiler.flash.tags.DoABCTag; -import com.jpexs.decompiler.flash.tags.DoActionTag; -import com.jpexs.decompiler.flash.tags.DoInitActionTag; -import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag; -import com.jpexs.decompiler.flash.tags.EnableDebuggerTag; -import com.jpexs.decompiler.flash.tags.EnableTelemetryTag; -import com.jpexs.decompiler.flash.tags.EndTag; -import com.jpexs.decompiler.flash.tags.ExportAssetsTag; -import com.jpexs.decompiler.flash.tags.FileAttributesTag; -import com.jpexs.decompiler.flash.tags.FrameLabelTag; -import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; -import com.jpexs.decompiler.flash.tags.ImportAssetsTag; -import com.jpexs.decompiler.flash.tags.JPEGTablesTag; -import com.jpexs.decompiler.flash.tags.MetadataTag; -import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; -import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; -import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; -import com.jpexs.decompiler.flash.tags.PlaceObjectTag; -import com.jpexs.decompiler.flash.tags.ProductInfoTag; -import com.jpexs.decompiler.flash.tags.ProtectTag; -import com.jpexs.decompiler.flash.tags.RemoveObject2Tag; -import com.jpexs.decompiler.flash.tags.RemoveObjectTag; -import com.jpexs.decompiler.flash.tags.ScriptLimitsTag; -import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; -import com.jpexs.decompiler.flash.tags.SetTabIndexTag; -import com.jpexs.decompiler.flash.tags.ShowFrameTag; -import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; -import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag; -import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag; -import com.jpexs.decompiler.flash.tags.StartSound2Tag; -import com.jpexs.decompiler.flash.tags.StartSoundTag; -import com.jpexs.decompiler.flash.tags.SymbolClassTag; -import com.jpexs.decompiler.flash.tags.VideoFrameTag; -import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont; -import com.jpexs.decompiler.flash.tags.gfx.DefineExternalGradient; -import com.jpexs.decompiler.flash.tags.gfx.DefineExternalImage; -import com.jpexs.decompiler.flash.tags.gfx.DefineExternalImage2; -import com.jpexs.decompiler.flash.tags.gfx.DefineExternalSound; -import com.jpexs.decompiler.flash.tags.gfx.DefineExternalStreamSound; -import com.jpexs.decompiler.flash.tags.gfx.DefineGradientMap; -import com.jpexs.decompiler.flash.tags.gfx.DefineSubImage; -import com.jpexs.decompiler.flash.tags.gfx.ExporterInfo; -import com.jpexs.decompiler.flash.tags.gfx.FontTextureInfo; -import java.util.HashMap; -import java.util.Map; - -/** - * - * @author JPEXS - */ -public class TagIdClassMap { - - private static final Map> tagIdClassMap = new HashMap<>(); - - private static final Map classTagIdMap = new HashMap<>(); - - static { - addTag(CSMTextSettingsTag.ID, CSMTextSettingsTag.class); - addTag(DebugIDTag.ID, DebugIDTag.class); - addTag(DefineBinaryDataTag.ID, DefineBinaryDataTag.class); - addTag(DefineBitsJPEG2Tag.ID, DefineBitsJPEG2Tag.class); - addTag(DefineBitsJPEG3Tag.ID, DefineBitsJPEG3Tag.class); - addTag(DefineBitsJPEG4Tag.ID, DefineBitsJPEG4Tag.class); - addTag(DefineBitsLossless2Tag.ID, DefineBitsLossless2Tag.class); - addTag(DefineBitsLosslessTag.ID, DefineBitsLosslessTag.class); - addTag(DefineBitsTag.ID, DefineBitsTag.class); - addTag(DefineButton2Tag.ID, DefineButton2Tag.class); - addTag(DefineButtonCxformTag.ID, DefineButtonCxformTag.class); - addTag(DefineButtonSoundTag.ID, DefineButtonSoundTag.class); - addTag(DefineButtonTag.ID, DefineButtonTag.class); - addTag(DefineEditTextTag.ID, DefineEditTextTag.class); - addTag(DefineFont2Tag.ID, DefineFont2Tag.class); - addTag(DefineFont3Tag.ID, DefineFont3Tag.class); - addTag(DefineFont4Tag.ID, DefineFont4Tag.class); - addTag(DefineFontAlignZonesTag.ID, DefineFontAlignZonesTag.class); - addTag(DefineFontInfo2Tag.ID, DefineFontInfo2Tag.class); - addTag(DefineFontInfoTag.ID, DefineFontInfoTag.class); - addTag(DefineFontNameTag.ID, DefineFontNameTag.class); - addTag(DefineFontTag.ID, DefineFontTag.class); - addTag(DefineMorphShape2Tag.ID, DefineMorphShape2Tag.class); - addTag(DefineMorphShapeTag.ID, DefineMorphShapeTag.class); - addTag(DefineScalingGridTag.ID, DefineScalingGridTag.class); - addTag(DefineSceneAndFrameLabelDataTag.ID, DefineSceneAndFrameLabelDataTag.class); - addTag(DefineShape2Tag.ID, DefineShape2Tag.class); - addTag(DefineShape3Tag.ID, DefineShape3Tag.class); - addTag(DefineShape4Tag.ID, DefineShape4Tag.class); - addTag(DefineShapeTag.ID, DefineShapeTag.class); - addTag(DefineSoundTag.ID, DefineSoundTag.class); - addTag(DefineSpriteTag.ID, DefineSpriteTag.class); - addTag(DefineText2Tag.ID, DefineText2Tag.class); - addTag(DefineTextTag.ID, DefineTextTag.class); - addTag(DefineVideoStreamTag.ID, DefineVideoStreamTag.class); - addTag(DoABCDefineTag.ID, DoABCDefineTag.class); - addTag(DoABCTag.ID, DoABCTag.class); - addTag(DoActionTag.ID, DoActionTag.class); - addTag(DoInitActionTag.ID, DoInitActionTag.class); - addTag(EnableDebugger2Tag.ID, EnableDebugger2Tag.class); - addTag(EnableDebuggerTag.ID, EnableDebuggerTag.class); - addTag(EnableTelemetryTag.ID, EnableTelemetryTag.class); - addTag(EndTag.ID, EndTag.class); - addTag(ExportAssetsTag.ID, ExportAssetsTag.class); - addTag(FileAttributesTag.ID, FileAttributesTag.class); - addTag(FrameLabelTag.ID, FrameLabelTag.class); - addTag(ImportAssets2Tag.ID, ImportAssets2Tag.class); - addTag(ImportAssetsTag.ID, ImportAssetsTag.class); - addTag(JPEGTablesTag.ID, JPEGTablesTag.class); - addTag(MetadataTag.ID, MetadataTag.class); - addTag(PlaceObject2Tag.ID, PlaceObject2Tag.class); - addTag(PlaceObject3Tag.ID, PlaceObject3Tag.class); - addTag(PlaceObject4Tag.ID, PlaceObject4Tag.class); - addTag(PlaceObjectTag.ID, PlaceObjectTag.class); - addTag(ProductInfoTag.ID, ProductInfoTag.class); - addTag(ProtectTag.ID, ProtectTag.class); - addTag(RemoveObject2Tag.ID, RemoveObject2Tag.class); - addTag(RemoveObjectTag.ID, RemoveObjectTag.class); - addTag(ScriptLimitsTag.ID, ScriptLimitsTag.class); - addTag(SetBackgroundColorTag.ID, SetBackgroundColorTag.class); - addTag(SetTabIndexTag.ID, SetTabIndexTag.class); - addTag(ShowFrameTag.ID, ShowFrameTag.class); - addTag(SoundStreamBlockTag.ID, SoundStreamBlockTag.class); - addTag(SoundStreamHead2Tag.ID, SoundStreamHead2Tag.class); - addTag(SoundStreamHeadTag.ID, SoundStreamHeadTag.class); - addTag(StartSound2Tag.ID, StartSound2Tag.class); - addTag(StartSoundTag.ID, StartSoundTag.class); - addTag(SymbolClassTag.ID, SymbolClassTag.class); - addTag(VideoFrameTag.ID, VideoFrameTag.class); - addTag(DefineCompactedFont.ID, DefineCompactedFont.class); - addTag(DefineExternalGradient.ID, DefineExternalGradient.class); - addTag(DefineExternalImage.ID, DefineExternalImage.class); - addTag(DefineExternalImage2.ID, DefineExternalImage2.class); - addTag(DefineExternalSound.ID, DefineExternalSound.class); - addTag(DefineExternalStreamSound.ID, DefineExternalStreamSound.class); - addTag(DefineGradientMap.ID, DefineGradientMap.class); - addTag(DefineSubImage.ID, DefineSubImage.class); - addTag(ExporterInfo.ID, ExporterInfo.class); - addTag(FontTextureInfo.ID, FontTextureInfo.class); - } - - private static void addTag(int tagId, Class cl) { - tagIdClassMap.put(tagId, cl); - classTagIdMap.put(cl, tagId); - } - - public static Class getClassByTagId(int tagId) { - return tagIdClassMap.get(tagId); - } - - public static Integer getTagIdByClass(Class cl) { - return classTagIdMap.get(cl); - } -} +/* + * Copyright (C) 2010-2015 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.tagtree; + +import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; +import com.jpexs.decompiler.flash.tags.DebugIDTag; +import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag; +import com.jpexs.decompiler.flash.tags.DefineBitsTag; +import com.jpexs.decompiler.flash.tags.DefineButton2Tag; +import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag; +import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag; +import com.jpexs.decompiler.flash.tags.DefineButtonTag; +import com.jpexs.decompiler.flash.tags.DefineEditTextTag; +import com.jpexs.decompiler.flash.tags.DefineFont2Tag; +import com.jpexs.decompiler.flash.tags.DefineFont3Tag; +import com.jpexs.decompiler.flash.tags.DefineFont4Tag; +import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag; +import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag; +import com.jpexs.decompiler.flash.tags.DefineFontInfoTag; +import com.jpexs.decompiler.flash.tags.DefineFontNameTag; +import com.jpexs.decompiler.flash.tags.DefineFontTag; +import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag; +import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag; +import com.jpexs.decompiler.flash.tags.DefineScalingGridTag; +import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag; +import com.jpexs.decompiler.flash.tags.DefineShape2Tag; +import com.jpexs.decompiler.flash.tags.DefineShape3Tag; +import com.jpexs.decompiler.flash.tags.DefineShape4Tag; +import com.jpexs.decompiler.flash.tags.DefineShapeTag; +import com.jpexs.decompiler.flash.tags.DefineSoundTag; +import com.jpexs.decompiler.flash.tags.DefineSpriteTag; +import com.jpexs.decompiler.flash.tags.DefineText2Tag; +import com.jpexs.decompiler.flash.tags.DefineTextTag; +import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; +import com.jpexs.decompiler.flash.tags.DoABCTag; +import com.jpexs.decompiler.flash.tags.DoActionTag; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; +import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag; +import com.jpexs.decompiler.flash.tags.EnableDebuggerTag; +import com.jpexs.decompiler.flash.tags.EnableTelemetryTag; +import com.jpexs.decompiler.flash.tags.EndTag; +import com.jpexs.decompiler.flash.tags.ExportAssetsTag; +import com.jpexs.decompiler.flash.tags.FileAttributesTag; +import com.jpexs.decompiler.flash.tags.FrameLabelTag; +import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; +import com.jpexs.decompiler.flash.tags.ImportAssetsTag; +import com.jpexs.decompiler.flash.tags.JPEGTablesTag; +import com.jpexs.decompiler.flash.tags.MetadataTag; +import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; +import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; +import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; +import com.jpexs.decompiler.flash.tags.PlaceObjectTag; +import com.jpexs.decompiler.flash.tags.ProductInfoTag; +import com.jpexs.decompiler.flash.tags.ProtectTag; +import com.jpexs.decompiler.flash.tags.RemoveObject2Tag; +import com.jpexs.decompiler.flash.tags.RemoveObjectTag; +import com.jpexs.decompiler.flash.tags.ScriptLimitsTag; +import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; +import com.jpexs.decompiler.flash.tags.SetTabIndexTag; +import com.jpexs.decompiler.flash.tags.ShowFrameTag; +import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; +import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag; +import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag; +import com.jpexs.decompiler.flash.tags.StartSound2Tag; +import com.jpexs.decompiler.flash.tags.StartSoundTag; +import com.jpexs.decompiler.flash.tags.SymbolClassTag; +import com.jpexs.decompiler.flash.tags.VideoFrameTag; +import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont; +import com.jpexs.decompiler.flash.tags.gfx.DefineExternalGradient; +import com.jpexs.decompiler.flash.tags.gfx.DefineExternalImage; +import com.jpexs.decompiler.flash.tags.gfx.DefineExternalImage2; +import com.jpexs.decompiler.flash.tags.gfx.DefineExternalSound; +import com.jpexs.decompiler.flash.tags.gfx.DefineExternalStreamSound; +import com.jpexs.decompiler.flash.tags.gfx.DefineGradientMap; +import com.jpexs.decompiler.flash.tags.gfx.DefineSubImage; +import com.jpexs.decompiler.flash.tags.gfx.ExporterInfo; +import com.jpexs.decompiler.flash.tags.gfx.FontTextureInfo; +import java.util.HashMap; +import java.util.Map; + +/** + * + * @author JPEXS + */ +public class TagIdClassMap { + + private static final Map> tagIdClassMap = new HashMap<>(); + + private static final Map classTagIdMap = new HashMap<>(); + + static { + addTag(CSMTextSettingsTag.ID, CSMTextSettingsTag.class); + addTag(DebugIDTag.ID, DebugIDTag.class); + addTag(DefineBinaryDataTag.ID, DefineBinaryDataTag.class); + addTag(DefineBitsJPEG2Tag.ID, DefineBitsJPEG2Tag.class); + addTag(DefineBitsJPEG3Tag.ID, DefineBitsJPEG3Tag.class); + addTag(DefineBitsJPEG4Tag.ID, DefineBitsJPEG4Tag.class); + addTag(DefineBitsLossless2Tag.ID, DefineBitsLossless2Tag.class); + addTag(DefineBitsLosslessTag.ID, DefineBitsLosslessTag.class); + addTag(DefineBitsTag.ID, DefineBitsTag.class); + addTag(DefineButton2Tag.ID, DefineButton2Tag.class); + addTag(DefineButtonCxformTag.ID, DefineButtonCxformTag.class); + addTag(DefineButtonSoundTag.ID, DefineButtonSoundTag.class); + addTag(DefineButtonTag.ID, DefineButtonTag.class); + addTag(DefineEditTextTag.ID, DefineEditTextTag.class); + addTag(DefineFont2Tag.ID, DefineFont2Tag.class); + addTag(DefineFont3Tag.ID, DefineFont3Tag.class); + addTag(DefineFont4Tag.ID, DefineFont4Tag.class); + addTag(DefineFontAlignZonesTag.ID, DefineFontAlignZonesTag.class); + addTag(DefineFontInfo2Tag.ID, DefineFontInfo2Tag.class); + addTag(DefineFontInfoTag.ID, DefineFontInfoTag.class); + addTag(DefineFontNameTag.ID, DefineFontNameTag.class); + addTag(DefineFontTag.ID, DefineFontTag.class); + addTag(DefineMorphShape2Tag.ID, DefineMorphShape2Tag.class); + addTag(DefineMorphShapeTag.ID, DefineMorphShapeTag.class); + addTag(DefineScalingGridTag.ID, DefineScalingGridTag.class); + addTag(DefineSceneAndFrameLabelDataTag.ID, DefineSceneAndFrameLabelDataTag.class); + addTag(DefineShape2Tag.ID, DefineShape2Tag.class); + addTag(DefineShape3Tag.ID, DefineShape3Tag.class); + addTag(DefineShape4Tag.ID, DefineShape4Tag.class); + addTag(DefineShapeTag.ID, DefineShapeTag.class); + addTag(DefineSoundTag.ID, DefineSoundTag.class); + addTag(DefineSpriteTag.ID, DefineSpriteTag.class); + addTag(DefineText2Tag.ID, DefineText2Tag.class); + addTag(DefineTextTag.ID, DefineTextTag.class); + addTag(DefineVideoStreamTag.ID, DefineVideoStreamTag.class); + addTag(DoABC2Tag.ID, DoABC2Tag.class); + addTag(DoABCTag.ID, DoABCTag.class); + addTag(DoActionTag.ID, DoActionTag.class); + addTag(DoInitActionTag.ID, DoInitActionTag.class); + addTag(EnableDebugger2Tag.ID, EnableDebugger2Tag.class); + addTag(EnableDebuggerTag.ID, EnableDebuggerTag.class); + addTag(EnableTelemetryTag.ID, EnableTelemetryTag.class); + addTag(EndTag.ID, EndTag.class); + addTag(ExportAssetsTag.ID, ExportAssetsTag.class); + addTag(FileAttributesTag.ID, FileAttributesTag.class); + addTag(FrameLabelTag.ID, FrameLabelTag.class); + addTag(ImportAssets2Tag.ID, ImportAssets2Tag.class); + addTag(ImportAssetsTag.ID, ImportAssetsTag.class); + addTag(JPEGTablesTag.ID, JPEGTablesTag.class); + addTag(MetadataTag.ID, MetadataTag.class); + addTag(PlaceObject2Tag.ID, PlaceObject2Tag.class); + addTag(PlaceObject3Tag.ID, PlaceObject3Tag.class); + addTag(PlaceObject4Tag.ID, PlaceObject4Tag.class); + addTag(PlaceObjectTag.ID, PlaceObjectTag.class); + addTag(ProductInfoTag.ID, ProductInfoTag.class); + addTag(ProtectTag.ID, ProtectTag.class); + addTag(RemoveObject2Tag.ID, RemoveObject2Tag.class); + addTag(RemoveObjectTag.ID, RemoveObjectTag.class); + addTag(ScriptLimitsTag.ID, ScriptLimitsTag.class); + addTag(SetBackgroundColorTag.ID, SetBackgroundColorTag.class); + addTag(SetTabIndexTag.ID, SetTabIndexTag.class); + addTag(ShowFrameTag.ID, ShowFrameTag.class); + addTag(SoundStreamBlockTag.ID, SoundStreamBlockTag.class); + addTag(SoundStreamHead2Tag.ID, SoundStreamHead2Tag.class); + addTag(SoundStreamHeadTag.ID, SoundStreamHeadTag.class); + addTag(StartSound2Tag.ID, StartSound2Tag.class); + addTag(StartSoundTag.ID, StartSoundTag.class); + addTag(SymbolClassTag.ID, SymbolClassTag.class); + addTag(VideoFrameTag.ID, VideoFrameTag.class); + addTag(DefineCompactedFont.ID, DefineCompactedFont.class); + addTag(DefineExternalGradient.ID, DefineExternalGradient.class); + addTag(DefineExternalImage.ID, DefineExternalImage.class); + addTag(DefineExternalImage2.ID, DefineExternalImage2.class); + addTag(DefineExternalSound.ID, DefineExternalSound.class); + addTag(DefineExternalStreamSound.ID, DefineExternalStreamSound.class); + addTag(DefineGradientMap.ID, DefineGradientMap.class); + addTag(DefineSubImage.ID, DefineSubImage.class); + addTag(ExporterInfo.ID, ExporterInfo.class); + addTag(FontTextureInfo.ID, FontTextureInfo.class); + } + + private static void addTag(int tagId, Class cl) { + tagIdClassMap.put(tagId, cl); + classTagIdMap.put(cl, tagId); + } + + public static Class getClassByTagId(int tagId) { + return tagIdClassMap.get(tagId); + } + + public static Integer getTagIdByClass(Class cl) { + return classTagIdMap.get(cl); + } +} diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index b49aeccad..4a0dcc7c5 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -1,654 +1,654 @@ -/* - * Copyright (C) 2010-2015 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.tagtree; - -import com.jpexs.decompiler.flash.SWC; -import com.jpexs.decompiler.flash.SWF; -import com.jpexs.decompiler.flash.ZippedSWFBundle; -import com.jpexs.decompiler.flash.abc.ScriptPack; -import com.jpexs.decompiler.flash.gui.MainPanel; -import com.jpexs.decompiler.flash.gui.TreeNodeType; -import com.jpexs.decompiler.flash.gui.View; -import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; -import com.jpexs.decompiler.flash.tags.DebugIDTag; -import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag; -import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag; -import com.jpexs.decompiler.flash.tags.DefineBitsTag; -import com.jpexs.decompiler.flash.tags.DefineButton2Tag; -import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag; -import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag; -import com.jpexs.decompiler.flash.tags.DefineButtonTag; -import com.jpexs.decompiler.flash.tags.DefineEditTextTag; -import com.jpexs.decompiler.flash.tags.DefineFont2Tag; -import com.jpexs.decompiler.flash.tags.DefineFont3Tag; -import com.jpexs.decompiler.flash.tags.DefineFont4Tag; -import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag; -import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag; -import com.jpexs.decompiler.flash.tags.DefineFontInfoTag; -import com.jpexs.decompiler.flash.tags.DefineFontNameTag; -import com.jpexs.decompiler.flash.tags.DefineFontTag; -import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag; -import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag; -import com.jpexs.decompiler.flash.tags.DefineScalingGridTag; -import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag; -import com.jpexs.decompiler.flash.tags.DefineShape2Tag; -import com.jpexs.decompiler.flash.tags.DefineShape3Tag; -import com.jpexs.decompiler.flash.tags.DefineShape4Tag; -import com.jpexs.decompiler.flash.tags.DefineShapeTag; -import com.jpexs.decompiler.flash.tags.DefineSoundTag; -import com.jpexs.decompiler.flash.tags.DefineSpriteTag; -import com.jpexs.decompiler.flash.tags.DefineText2Tag; -import com.jpexs.decompiler.flash.tags.DefineTextTag; -import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; -import com.jpexs.decompiler.flash.tags.DoABCDefineTag; -import com.jpexs.decompiler.flash.tags.DoABCTag; -import com.jpexs.decompiler.flash.tags.DoActionTag; -import com.jpexs.decompiler.flash.tags.DoInitActionTag; -import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag; -import com.jpexs.decompiler.flash.tags.EnableDebuggerTag; -import com.jpexs.decompiler.flash.tags.EnableTelemetryTag; -import com.jpexs.decompiler.flash.tags.ExportAssetsTag; -import com.jpexs.decompiler.flash.tags.FileAttributesTag; -import com.jpexs.decompiler.flash.tags.FrameLabelTag; -import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; -import com.jpexs.decompiler.flash.tags.ImportAssetsTag; -import com.jpexs.decompiler.flash.tags.JPEGTablesTag; -import com.jpexs.decompiler.flash.tags.MetadataTag; -import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; -import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; -import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; -import com.jpexs.decompiler.flash.tags.PlaceObjectTag; -import com.jpexs.decompiler.flash.tags.ProductInfoTag; -import com.jpexs.decompiler.flash.tags.ProtectTag; -import com.jpexs.decompiler.flash.tags.RemoveObject2Tag; -import com.jpexs.decompiler.flash.tags.RemoveObjectTag; -import com.jpexs.decompiler.flash.tags.ScriptLimitsTag; -import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; -import com.jpexs.decompiler.flash.tags.SetTabIndexTag; -import com.jpexs.decompiler.flash.tags.ShowFrameTag; -import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; -import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag; -import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag; -import com.jpexs.decompiler.flash.tags.StartSound2Tag; -import com.jpexs.decompiler.flash.tags.StartSoundTag; -import com.jpexs.decompiler.flash.tags.SymbolClassTag; -import com.jpexs.decompiler.flash.tags.Tag; -import com.jpexs.decompiler.flash.tags.VideoFrameTag; -import com.jpexs.decompiler.flash.tags.base.ASMSource; -import com.jpexs.decompiler.flash.tags.base.ButtonTag; -import com.jpexs.decompiler.flash.tags.base.FontTag; -import com.jpexs.decompiler.flash.tags.base.ImageTag; -import com.jpexs.decompiler.flash.tags.base.MorphShapeTag; -import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag; -import com.jpexs.decompiler.flash.tags.base.RemoveTag; -import com.jpexs.decompiler.flash.tags.base.ShapeTag; -import com.jpexs.decompiler.flash.tags.base.SymbolClassTypeTag; -import com.jpexs.decompiler.flash.tags.base.TextTag; -import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont; -import com.jpexs.decompiler.flash.timeline.AS2Package; -import com.jpexs.decompiler.flash.timeline.AS3Package; -import com.jpexs.decompiler.flash.timeline.Frame; -import com.jpexs.decompiler.flash.timeline.FrameScript; -import com.jpexs.decompiler.flash.timeline.TagScript; -import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; -import com.jpexs.decompiler.flash.treeitems.FolderItem; -import com.jpexs.decompiler.flash.treeitems.HeaderItem; -import com.jpexs.decompiler.flash.treeitems.SWFList; -import com.jpexs.decompiler.flash.treeitems.TreeItem; -import java.awt.Color; -import java.awt.Component; -import java.awt.Font; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import javax.swing.Icon; -import javax.swing.JTree; -import javax.swing.plaf.basic.BasicLabelUI; -import javax.swing.plaf.basic.BasicTreeUI; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - -/** - * - * @author JPEXS - */ -public class TagTree extends JTree { - - public TagTreeContextMenu contextPopupMenu; - - private final MainPanel mainPanel; - - public class TagTreeCellRenderer extends DefaultTreeCellRenderer { - - private Font plainFont; - - private Font boldFont; - - private final Map icons; - - public TagTreeCellRenderer() { - setUI(new BasicLabelUI()); - setOpaque(false); - //setBackground(Color.green); - setBackgroundNonSelectionColor(Color.white); - //setBackgroundSelectionColor(Color.ORANGE); - - icons = new HashMap<>(); - for (TreeNodeType treeNodeType : TreeNodeType.values()) { - if (treeNodeType != TreeNodeType.UNKNOWN && treeNodeType != TreeNodeType.SHOW_FRAME) { - String tagTypeStr = treeNodeType.toString().toLowerCase().replace("_", ""); - icons.put(treeNodeType, View.getIcon(tagTypeStr + "16")); - } - } - } - - @Override - public Component getTreeCellRendererComponent( - JTree tree, - Object value, - boolean sel, - boolean expanded, - boolean leaf, - int row, - boolean hasFocus) { - - TreeItem val = (TreeItem) value; - if (!(val instanceof SWFList) && val.getSwf() == null) { - // SWF was closed - value = null; - } - - super.getTreeCellRendererComponent( - tree, value, sel, - expanded, leaf, row, - hasFocus); - TreeNodeType type = getTreeNodeType(val); - - if (type == TreeNodeType.FOLDER && expanded) { - type = TreeNodeType.FOLDER_OPEN; - } - - if ((type == TreeNodeType.FOLDER || type == TreeNodeType.FOLDER_OPEN) && val instanceof FolderItem) { - FolderItem si = (FolderItem) val; - if (!TagTreeRoot.FOLDER_ROOT.equals(si.getName())) { - String itemName = "folder" + si.getName(); - setIcon(View.getIcon(itemName.toLowerCase() + "16")); - } - } else { - setIcon(icons.get(type)); - } - - /* boolean isModified = val instanceof Tag && ((Tag) val).isModified(); - if(val instanceof ScriptPack){ - ScriptPack sp=(ScriptPack)val; - if(sp.abc.script_info.get(sp.scriptIndex).isModified()){ - isModified = true; - } - }*/ - boolean isModified = val.isModified(); - if (isModified) { - if (boldFont == null) { - Font font = getFont(); - boldFont = font.deriveFont(Font.BOLD); - } - } else { - if (plainFont == null) { - Font font = getFont(); - plainFont = font.deriveFont(Font.PLAIN); - } - } - setFont(isModified ? boldFont : plainFont); - - return this; - } - } - - public TagTree(TagTreeModel treeModel, MainPanel mainPanel) { - super(treeModel); - this.mainPanel = mainPanel; - setCellRenderer(new TagTreeCellRenderer()); - setRootVisible(false); - setBackground(Color.white); - setRowHeight(Math.max(getFont().getSize() + 5, 16)); - setLargeModel(true); - setUI(new BasicTreeUI() { - { - setHashColor(Color.gray); - } - }); - } - - public void createContextMenu() { - contextPopupMenu = new TagTreeContextMenu(this, mainPanel); - } - - public static TreeNodeType getTreeNodeType(TreeItem t) { - - if (t instanceof TagScript) { - t = ((TagScript) t).getTag(); - } - - if (t instanceof HeaderItem) { - return TreeNodeType.HEADER; - } - - if ((t instanceof DefineFontTag) - || (t instanceof DefineFont2Tag) - || (t instanceof DefineFont3Tag) - || (t instanceof DefineFont4Tag) - || (t instanceof DefineCompactedFont)) { - return TreeNodeType.FONT; - } - - // DefineText, DefineText2, DefineEditTextTag - if (t instanceof TextTag) { - return TreeNodeType.TEXT; - } - - // DefineBits, DefineBitsJPEG2, DefineBitsJPEG3, DefineBitsJPEG4, DefineBitsLossless, DefineBitsLossless2 - if (t instanceof ImageTag) { - return TreeNodeType.IMAGE; - } - - // DefineShape, DefineShape2, DefineShape3, DefineShape4 - if (t instanceof ShapeTag) { - return TreeNodeType.SHAPE; - } - - // DefineMorphShape, DefineMorphShape2 - if (t instanceof MorphShapeTag) { - return TreeNodeType.MORPH_SHAPE; - } - - if (t instanceof DefineSpriteTag) { - return TreeNodeType.SPRITE; - } - - // DefineButton, DefineButton2 - if (t instanceof ButtonTag) { - return TreeNodeType.BUTTON; - } - - if (t instanceof DefineVideoStreamTag) { - return TreeNodeType.MOVIE; - } - - if ((t instanceof DefineSoundTag) || (t instanceof SoundStreamHeadTag) || (t instanceof SoundStreamHead2Tag)) { - return TreeNodeType.SOUND; - } - - if (t instanceof DefineBinaryDataTag) { - return TreeNodeType.BINARY_DATA; - } - - if (t instanceof ASMSource) { - return TreeNodeType.AS; - } - - if (t instanceof ScriptPack) { - return TreeNodeType.AS; - } - - if (t instanceof AS2Package) { - return TreeNodeType.PACKAGE; - } - - if (t instanceof AS3Package) { - return TreeNodeType.PACKAGE; - } - - if ((t instanceof Frame) - || (t instanceof FrameScript)) { - return TreeNodeType.FRAME; - } - - if (t instanceof ShowFrameTag) { - return TreeNodeType.SHOW_FRAME; - } - - if (t instanceof SWF) { - return TreeNodeType.FLASH; - } - - if (t instanceof SWFList) { - SWFList slist = (SWFList) t; - if (slist.isBundle()) { - if (slist.bundle.getClass() == ZippedSWFBundle.class) { - return TreeNodeType.BUNDLE_ZIP; - } else if (slist.bundle.getClass() == SWC.class) { - return TreeNodeType.BUNDLE_SWC; - } else { - return TreeNodeType.BUNDLE_BINARY; - } - } - } - - if (t instanceof SetBackgroundColorTag) { - return TreeNodeType.SET_BACKGROUNDCOLOR; - } - if (t instanceof FileAttributesTag) { - return TreeNodeType.FILE_ATTRIBUTES; - } - if (t instanceof MetadataTag) { - return TreeNodeType.METADATA; - } - if (t instanceof PlaceObjectTypeTag) { - return TreeNodeType.PLACE_OBJECT; - } - if (t instanceof RemoveTag) { - return TreeNodeType.REMOVE_OBJECT; - } - if (t instanceof Tag) { - return TreeNodeType.OTHER_TAG; - } - - if (t instanceof FolderItem) { - return TreeNodeType.FOLDER; - } - - return TreeNodeType.FOLDER; - } - - public List getSwfFolderItemNestedTagIds(String folderName, boolean gfx) { - List ret = null; - switch (folderName) { - case TagTreeModel.FOLDER_SHAPES: - ret = Arrays.asList(DefineShapeTag.ID, DefineShape2Tag.ID, DefineShape3Tag.ID, DefineShape4Tag.ID); - break; - case TagTreeModel.FOLDER_MORPHSHAPES: - ret = Arrays.asList(DefineMorphShapeTag.ID, DefineMorphShape2Tag.ID); - break; - case TagTreeModel.FOLDER_SPRITES: - ret = Arrays.asList(DefineSpriteTag.ID); - break; - case TagTreeModel.FOLDER_TEXTS: - ret = Arrays.asList(DefineTextTag.ID, DefineText2Tag.ID, DefineEditTextTag.ID); - break; - case TagTreeModel.FOLDER_IMAGES: - ret = Arrays.asList(DefineBitsTag.ID, DefineBitsJPEG2Tag.ID, DefineBitsJPEG3Tag.ID, DefineBitsJPEG4Tag.ID, DefineBitsLosslessTag.ID, DefineBitsLossless2Tag.ID); - break; - case TagTreeModel.FOLDER_MOVIES: - ret = Arrays.asList(DefineVideoStreamTag.ID); - break; - case TagTreeModel.FOLDER_SOUNDS: - ret = Arrays.asList(DefineSoundTag.ID); - break; - case TagTreeModel.FOLDER_BUTTONS: - ret = Arrays.asList(DefineButtonTag.ID, DefineButton2Tag.ID); - break; - case TagTreeModel.FOLDER_FONTS: - if (gfx) { - ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID, DefineCompactedFont.ID); - } else { - ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID); - } - break; - case TagTreeModel.FOLDER_BINARY_DATA: - ret = Arrays.asList(DefineBinaryDataTag.ID); - break; - case TagTreeModel.FOLDER_FRAMES: - ret = new ArrayList<>(); - break; - case TagTreeModel.FOLDER_OTHERS: - ret = Arrays.asList( - //CSMTextSettingsTag.ID, - DebugIDTag.ID, - //DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, - //DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID, DefineFontNameTag.ID, - /*DefineScalingGridTag.ID,*/ DefineSceneAndFrameLabelDataTag.ID, - DoABCDefineTag.ID, DoABCTag.ID, DoActionTag.ID, DoInitActionTag.ID, - EnableDebuggerTag.ID, EnableDebugger2Tag.ID, EnableTelemetryTag.ID, - ExportAssetsTag.ID, FileAttributesTag.ID, ImportAssetsTag.ID, ImportAssets2Tag.ID, - JPEGTablesTag.ID, MetadataTag.ID, ProductInfoTag.ID, ProtectTag.ID, ScriptLimitsTag.ID, - SetBackgroundColorTag.ID, SetTabIndexTag.ID, SymbolClassTag.ID); - break; - } - - return ret; - } - - public List getNestedTagIds(Tag obj) { - if (obj instanceof DefineSpriteTag) { - return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, - RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, - StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, - SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, - DefineScalingGridTag.ID); - } - if (obj instanceof FontTag) { - return Arrays.asList(DefineFontNameTag.ID, DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID); - } - if (obj instanceof TextTag) { - return Arrays.asList(CSMTextSettingsTag.ID); - } - if (obj instanceof DefineButtonTag) { - return Arrays.asList(DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, DefineScalingGridTag.ID); - } - if (obj instanceof DefineButton2Tag) { - return Arrays.asList(DefineButtonSoundTag.ID, DefineScalingGridTag.ID); - } - return null; - } - - public boolean hasExportableNodes() { - return !getSelection(mainPanel.getCurrentSwf()).isEmpty(); - } - - public void getAllSubs(JTree tree, TreeItem o, List ret) { - TagTreeModel tm = (TagTreeModel) tree.getModel(); - for (TreeItem c : tm.getAllChildren(o)) { - ret.add(c); - getAllSubs(tree, c, ret); - } - } - - public List getAllSelected(TagTree tree) { - TreeSelectionModel tsm = tree.getSelectionModel(); - TreePath[] tps = tsm.getSelectionPaths(); - List ret = new ArrayList<>(); - if (tps == null) { - return ret; - } - - for (TreePath tp : tps) { - TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); - ret.add(treeNode); - getAllSubs(tree, treeNode, ret); - } - return ret; - } - - public List getSelected(JTree tree) { - if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - return new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); - } - TreeSelectionModel tsm = tree.getSelectionModel(); - TreePath[] tps = tsm.getSelectionPaths(); - List ret = new ArrayList<>(); - if (tps == null) { - return ret; - } - - for (TreePath tp : tps) { - TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); - ret.add(treeNode); - } - return ret; - } - - public List getSelection(SWF swf) { - List sel; - if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - sel = getAllSelected(this); - } else { - sel = new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); - } - return getSelection(swf, sel); - } - - public List getSelection(SWF swf, List sel) { - List ret = new ArrayList<>(); - for (TreeItem d : sel) { - if (d instanceof SWFList) { - continue; - } - if (d.getSwf() != swf) { - continue; - } - - if (d instanceof TagScript) { - Tag tag = ((TagScript) d).getTag(); - if (tag instanceof DoActionTag || tag instanceof DoInitActionTag) { - d = tag; - } - } - - if (d instanceof Tag || d instanceof ASMSource) { - TreeNodeType nodeType = TagTree.getTreeNodeType(d); - if (nodeType == TreeNodeType.IMAGE) { - ret.add(d); - } - if (nodeType == TreeNodeType.SHAPE) { - ret.add(d); - } - if (nodeType == TreeNodeType.MORPH_SHAPE) { - ret.add(d); - } - if (nodeType == TreeNodeType.BUTTON) { - ret.add(d); - } - if (nodeType == TreeNodeType.AS) { - ret.add(d); - } - if (nodeType == TreeNodeType.MOVIE) { - ret.add(d); - } - if (nodeType == TreeNodeType.SOUND) { - ret.add(d); - } - if (nodeType == TreeNodeType.BINARY_DATA) { - ret.add(d); - } - if (nodeType == TreeNodeType.TEXT) { - ret.add(d); - } - if (nodeType == TreeNodeType.FONT) { - ret.add(d); - } - if (nodeType == TreeNodeType.OTHER_TAG) { - if (d instanceof SymbolClassTypeTag) { - ret.add(d); - } - } - } - - if (d instanceof Frame) { - ret.add(d); - } - if (d instanceof ScriptPack) { - ret.add(d); - } - } - return ret; - } - - public List getTagsWithType(List list, TreeNodeType type) { - List ret = new ArrayList<>(); - for (AS3ClassTreeItem item : list) { - TreeNodeType ttype = getTreeNodeType(item); - if (type == ttype) { - ret.add(item); - } - } - return ret; - } - - public TreeItem getCurrentTreeItem() { - if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - return mainPanel.folderPreviewPanel.selectedItems.entrySet().iterator().next().getValue(); - } - - TreeItem item = (TreeItem) getLastSelectedPathComponent(); - return item; - } - - public void updateSwfs(SWF[] swfs) { - TagTreeModel ttm = getModel(); - if (ttm != null) { - List> expandedNodes = View.getExpandedNodes(this); - ttm.updateSwf(null); // todo: honfika: update only the changed swfs, but there was an exception when i tried it - View.expandTreeNodes(this, expandedNodes); - } - } - - @Override - public TagTreeModel getModel() { - return (TagTreeModel) super.getModel(); - } - - public void expandRoot() { - TagTreeModel ttm = getModel(); - TreeItem root = ttm.getRoot(); - expandPath(new TreePath(new Object[]{root})); - } - - public void expandFirstLevelNodes() { - TagTreeModel ttm = getModel(); - TreeItem root = ttm.getRoot(); - int childCount = ttm.getChildCount(root); - for (int i = 0; i < childCount; i++) { - expandPath(new TreePath(new Object[]{root, ttm.getChild(root, i)})); - } - } - - public String getSelectionPathString() { - StringBuilder sb = new StringBuilder(); - TreePath path = getSelectionPath(); - if (path != null) { - boolean first = true; - for (Object p : path.getPath()) { - if (!first) { - sb.append("|"); - } - - first = false; - sb.append(p.toString()); - } - } - - return sb.toString(); - } - - public void setSelectionPathString(String pathStr) { - if (pathStr != null && pathStr.length() > 0) { - String[] path = pathStr.split("\\|"); - - TreePath tp = View.getTreePathByPathStrings(this, Arrays.asList(path)); - if (tp != null) { - // the current view is the Resources view, otherwise tp is null - mainPanel.setTagTreeSelectedNode((TreeItem) tp.getLastPathComponent()); - } - } - } -} +/* + * Copyright (C) 2010-2015 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.tagtree; + +import com.jpexs.decompiler.flash.SWC; +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.ZippedSWFBundle; +import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.flash.gui.MainPanel; +import com.jpexs.decompiler.flash.gui.TreeNodeType; +import com.jpexs.decompiler.flash.gui.View; +import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag; +import com.jpexs.decompiler.flash.tags.DebugIDTag; +import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag; +import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag; +import com.jpexs.decompiler.flash.tags.DefineBitsTag; +import com.jpexs.decompiler.flash.tags.DefineButton2Tag; +import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag; +import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag; +import com.jpexs.decompiler.flash.tags.DefineButtonTag; +import com.jpexs.decompiler.flash.tags.DefineEditTextTag; +import com.jpexs.decompiler.flash.tags.DefineFont2Tag; +import com.jpexs.decompiler.flash.tags.DefineFont3Tag; +import com.jpexs.decompiler.flash.tags.DefineFont4Tag; +import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag; +import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag; +import com.jpexs.decompiler.flash.tags.DefineFontInfoTag; +import com.jpexs.decompiler.flash.tags.DefineFontNameTag; +import com.jpexs.decompiler.flash.tags.DefineFontTag; +import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag; +import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag; +import com.jpexs.decompiler.flash.tags.DefineScalingGridTag; +import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag; +import com.jpexs.decompiler.flash.tags.DefineShape2Tag; +import com.jpexs.decompiler.flash.tags.DefineShape3Tag; +import com.jpexs.decompiler.flash.tags.DefineShape4Tag; +import com.jpexs.decompiler.flash.tags.DefineShapeTag; +import com.jpexs.decompiler.flash.tags.DefineSoundTag; +import com.jpexs.decompiler.flash.tags.DefineSpriteTag; +import com.jpexs.decompiler.flash.tags.DefineText2Tag; +import com.jpexs.decompiler.flash.tags.DefineTextTag; +import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag; +import com.jpexs.decompiler.flash.tags.DoABC2Tag; +import com.jpexs.decompiler.flash.tags.DoABCTag; +import com.jpexs.decompiler.flash.tags.DoActionTag; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; +import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag; +import com.jpexs.decompiler.flash.tags.EnableDebuggerTag; +import com.jpexs.decompiler.flash.tags.EnableTelemetryTag; +import com.jpexs.decompiler.flash.tags.ExportAssetsTag; +import com.jpexs.decompiler.flash.tags.FileAttributesTag; +import com.jpexs.decompiler.flash.tags.FrameLabelTag; +import com.jpexs.decompiler.flash.tags.ImportAssets2Tag; +import com.jpexs.decompiler.flash.tags.ImportAssetsTag; +import com.jpexs.decompiler.flash.tags.JPEGTablesTag; +import com.jpexs.decompiler.flash.tags.MetadataTag; +import com.jpexs.decompiler.flash.tags.PlaceObject2Tag; +import com.jpexs.decompiler.flash.tags.PlaceObject3Tag; +import com.jpexs.decompiler.flash.tags.PlaceObject4Tag; +import com.jpexs.decompiler.flash.tags.PlaceObjectTag; +import com.jpexs.decompiler.flash.tags.ProductInfoTag; +import com.jpexs.decompiler.flash.tags.ProtectTag; +import com.jpexs.decompiler.flash.tags.RemoveObject2Tag; +import com.jpexs.decompiler.flash.tags.RemoveObjectTag; +import com.jpexs.decompiler.flash.tags.ScriptLimitsTag; +import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag; +import com.jpexs.decompiler.flash.tags.SetTabIndexTag; +import com.jpexs.decompiler.flash.tags.ShowFrameTag; +import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; +import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag; +import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag; +import com.jpexs.decompiler.flash.tags.StartSound2Tag; +import com.jpexs.decompiler.flash.tags.StartSoundTag; +import com.jpexs.decompiler.flash.tags.SymbolClassTag; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.tags.VideoFrameTag; +import com.jpexs.decompiler.flash.tags.base.ASMSource; +import com.jpexs.decompiler.flash.tags.base.ButtonTag; +import com.jpexs.decompiler.flash.tags.base.FontTag; +import com.jpexs.decompiler.flash.tags.base.ImageTag; +import com.jpexs.decompiler.flash.tags.base.MorphShapeTag; +import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag; +import com.jpexs.decompiler.flash.tags.base.RemoveTag; +import com.jpexs.decompiler.flash.tags.base.ShapeTag; +import com.jpexs.decompiler.flash.tags.base.SymbolClassTypeTag; +import com.jpexs.decompiler.flash.tags.base.TextTag; +import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont; +import com.jpexs.decompiler.flash.timeline.AS2Package; +import com.jpexs.decompiler.flash.timeline.AS3Package; +import com.jpexs.decompiler.flash.timeline.Frame; +import com.jpexs.decompiler.flash.timeline.FrameScript; +import com.jpexs.decompiler.flash.timeline.TagScript; +import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem; +import com.jpexs.decompiler.flash.treeitems.FolderItem; +import com.jpexs.decompiler.flash.treeitems.HeaderItem; +import com.jpexs.decompiler.flash.treeitems.SWFList; +import com.jpexs.decompiler.flash.treeitems.TreeItem; +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.swing.Icon; +import javax.swing.JTree; +import javax.swing.plaf.basic.BasicLabelUI; +import javax.swing.plaf.basic.BasicTreeUI; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +/** + * + * @author JPEXS + */ +public class TagTree extends JTree { + + public TagTreeContextMenu contextPopupMenu; + + private final MainPanel mainPanel; + + public class TagTreeCellRenderer extends DefaultTreeCellRenderer { + + private Font plainFont; + + private Font boldFont; + + private final Map icons; + + public TagTreeCellRenderer() { + setUI(new BasicLabelUI()); + setOpaque(false); + //setBackground(Color.green); + setBackgroundNonSelectionColor(Color.white); + //setBackgroundSelectionColor(Color.ORANGE); + + icons = new HashMap<>(); + for (TreeNodeType treeNodeType : TreeNodeType.values()) { + if (treeNodeType != TreeNodeType.UNKNOWN && treeNodeType != TreeNodeType.SHOW_FRAME) { + String tagTypeStr = treeNodeType.toString().toLowerCase().replace("_", ""); + icons.put(treeNodeType, View.getIcon(tagTypeStr + "16")); + } + } + } + + @Override + public Component getTreeCellRendererComponent( + JTree tree, + Object value, + boolean sel, + boolean expanded, + boolean leaf, + int row, + boolean hasFocus) { + + TreeItem val = (TreeItem) value; + if (!(val instanceof SWFList) && val.getSwf() == null) { + // SWF was closed + value = null; + } + + super.getTreeCellRendererComponent( + tree, value, sel, + expanded, leaf, row, + hasFocus); + TreeNodeType type = getTreeNodeType(val); + + if (type == TreeNodeType.FOLDER && expanded) { + type = TreeNodeType.FOLDER_OPEN; + } + + if ((type == TreeNodeType.FOLDER || type == TreeNodeType.FOLDER_OPEN) && val instanceof FolderItem) { + FolderItem si = (FolderItem) val; + if (!TagTreeRoot.FOLDER_ROOT.equals(si.getName())) { + String itemName = "folder" + si.getName(); + setIcon(View.getIcon(itemName.toLowerCase() + "16")); + } + } else { + setIcon(icons.get(type)); + } + + /* boolean isModified = val instanceof Tag && ((Tag) val).isModified(); + if(val instanceof ScriptPack){ + ScriptPack sp=(ScriptPack)val; + if(sp.abc.script_info.get(sp.scriptIndex).isModified()){ + isModified = true; + } + }*/ + boolean isModified = val.isModified(); + if (isModified) { + if (boldFont == null) { + Font font = getFont(); + boldFont = font.deriveFont(Font.BOLD); + } + } else { + if (plainFont == null) { + Font font = getFont(); + plainFont = font.deriveFont(Font.PLAIN); + } + } + setFont(isModified ? boldFont : plainFont); + + return this; + } + } + + public TagTree(TagTreeModel treeModel, MainPanel mainPanel) { + super(treeModel); + this.mainPanel = mainPanel; + setCellRenderer(new TagTreeCellRenderer()); + setRootVisible(false); + setBackground(Color.white); + setRowHeight(Math.max(getFont().getSize() + 5, 16)); + setLargeModel(true); + setUI(new BasicTreeUI() { + { + setHashColor(Color.gray); + } + }); + } + + public void createContextMenu() { + contextPopupMenu = new TagTreeContextMenu(this, mainPanel); + } + + public static TreeNodeType getTreeNodeType(TreeItem t) { + + if (t instanceof TagScript) { + t = ((TagScript) t).getTag(); + } + + if (t instanceof HeaderItem) { + return TreeNodeType.HEADER; + } + + if ((t instanceof DefineFontTag) + || (t instanceof DefineFont2Tag) + || (t instanceof DefineFont3Tag) + || (t instanceof DefineFont4Tag) + || (t instanceof DefineCompactedFont)) { + return TreeNodeType.FONT; + } + + // DefineText, DefineText2, DefineEditTextTag + if (t instanceof TextTag) { + return TreeNodeType.TEXT; + } + + // DefineBits, DefineBitsJPEG2, DefineBitsJPEG3, DefineBitsJPEG4, DefineBitsLossless, DefineBitsLossless2 + if (t instanceof ImageTag) { + return TreeNodeType.IMAGE; + } + + // DefineShape, DefineShape2, DefineShape3, DefineShape4 + if (t instanceof ShapeTag) { + return TreeNodeType.SHAPE; + } + + // DefineMorphShape, DefineMorphShape2 + if (t instanceof MorphShapeTag) { + return TreeNodeType.MORPH_SHAPE; + } + + if (t instanceof DefineSpriteTag) { + return TreeNodeType.SPRITE; + } + + // DefineButton, DefineButton2 + if (t instanceof ButtonTag) { + return TreeNodeType.BUTTON; + } + + if (t instanceof DefineVideoStreamTag) { + return TreeNodeType.MOVIE; + } + + if ((t instanceof DefineSoundTag) || (t instanceof SoundStreamHeadTag) || (t instanceof SoundStreamHead2Tag)) { + return TreeNodeType.SOUND; + } + + if (t instanceof DefineBinaryDataTag) { + return TreeNodeType.BINARY_DATA; + } + + if (t instanceof ASMSource) { + return TreeNodeType.AS; + } + + if (t instanceof ScriptPack) { + return TreeNodeType.AS; + } + + if (t instanceof AS2Package) { + return TreeNodeType.PACKAGE; + } + + if (t instanceof AS3Package) { + return TreeNodeType.PACKAGE; + } + + if ((t instanceof Frame) + || (t instanceof FrameScript)) { + return TreeNodeType.FRAME; + } + + if (t instanceof ShowFrameTag) { + return TreeNodeType.SHOW_FRAME; + } + + if (t instanceof SWF) { + return TreeNodeType.FLASH; + } + + if (t instanceof SWFList) { + SWFList slist = (SWFList) t; + if (slist.isBundle()) { + if (slist.bundle.getClass() == ZippedSWFBundle.class) { + return TreeNodeType.BUNDLE_ZIP; + } else if (slist.bundle.getClass() == SWC.class) { + return TreeNodeType.BUNDLE_SWC; + } else { + return TreeNodeType.BUNDLE_BINARY; + } + } + } + + if (t instanceof SetBackgroundColorTag) { + return TreeNodeType.SET_BACKGROUNDCOLOR; + } + if (t instanceof FileAttributesTag) { + return TreeNodeType.FILE_ATTRIBUTES; + } + if (t instanceof MetadataTag) { + return TreeNodeType.METADATA; + } + if (t instanceof PlaceObjectTypeTag) { + return TreeNodeType.PLACE_OBJECT; + } + if (t instanceof RemoveTag) { + return TreeNodeType.REMOVE_OBJECT; + } + if (t instanceof Tag) { + return TreeNodeType.OTHER_TAG; + } + + if (t instanceof FolderItem) { + return TreeNodeType.FOLDER; + } + + return TreeNodeType.FOLDER; + } + + public List getSwfFolderItemNestedTagIds(String folderName, boolean gfx) { + List ret = null; + switch (folderName) { + case TagTreeModel.FOLDER_SHAPES: + ret = Arrays.asList(DefineShapeTag.ID, DefineShape2Tag.ID, DefineShape3Tag.ID, DefineShape4Tag.ID); + break; + case TagTreeModel.FOLDER_MORPHSHAPES: + ret = Arrays.asList(DefineMorphShapeTag.ID, DefineMorphShape2Tag.ID); + break; + case TagTreeModel.FOLDER_SPRITES: + ret = Arrays.asList(DefineSpriteTag.ID); + break; + case TagTreeModel.FOLDER_TEXTS: + ret = Arrays.asList(DefineTextTag.ID, DefineText2Tag.ID, DefineEditTextTag.ID); + break; + case TagTreeModel.FOLDER_IMAGES: + ret = Arrays.asList(DefineBitsTag.ID, DefineBitsJPEG2Tag.ID, DefineBitsJPEG3Tag.ID, DefineBitsJPEG4Tag.ID, DefineBitsLosslessTag.ID, DefineBitsLossless2Tag.ID); + break; + case TagTreeModel.FOLDER_MOVIES: + ret = Arrays.asList(DefineVideoStreamTag.ID); + break; + case TagTreeModel.FOLDER_SOUNDS: + ret = Arrays.asList(DefineSoundTag.ID); + break; + case TagTreeModel.FOLDER_BUTTONS: + ret = Arrays.asList(DefineButtonTag.ID, DefineButton2Tag.ID); + break; + case TagTreeModel.FOLDER_FONTS: + if (gfx) { + ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID, DefineCompactedFont.ID); + } else { + ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID); + } + break; + case TagTreeModel.FOLDER_BINARY_DATA: + ret = Arrays.asList(DefineBinaryDataTag.ID); + break; + case TagTreeModel.FOLDER_FRAMES: + ret = new ArrayList<>(); + break; + case TagTreeModel.FOLDER_OTHERS: + ret = Arrays.asList( + //CSMTextSettingsTag.ID, + DebugIDTag.ID, + //DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, + //DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID, DefineFontNameTag.ID, + /*DefineScalingGridTag.ID,*/ DefineSceneAndFrameLabelDataTag.ID, + DoABC2Tag.ID, DoABCTag.ID, DoActionTag.ID, DoInitActionTag.ID, + EnableDebuggerTag.ID, EnableDebugger2Tag.ID, EnableTelemetryTag.ID, + ExportAssetsTag.ID, FileAttributesTag.ID, ImportAssetsTag.ID, ImportAssets2Tag.ID, + JPEGTablesTag.ID, MetadataTag.ID, ProductInfoTag.ID, ProtectTag.ID, ScriptLimitsTag.ID, + SetBackgroundColorTag.ID, SetTabIndexTag.ID, SymbolClassTag.ID); + break; + } + + return ret; + } + + public List getNestedTagIds(Tag obj) { + if (obj instanceof DefineSpriteTag) { + return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, + RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, + StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, + SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, + DefineScalingGridTag.ID); + } + if (obj instanceof FontTag) { + return Arrays.asList(DefineFontNameTag.ID, DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID); + } + if (obj instanceof TextTag) { + return Arrays.asList(CSMTextSettingsTag.ID); + } + if (obj instanceof DefineButtonTag) { + return Arrays.asList(DefineButtonCxformTag.ID, DefineButtonSoundTag.ID, DefineScalingGridTag.ID); + } + if (obj instanceof DefineButton2Tag) { + return Arrays.asList(DefineButtonSoundTag.ID, DefineScalingGridTag.ID); + } + return null; + } + + public boolean hasExportableNodes() { + return !getSelection(mainPanel.getCurrentSwf()).isEmpty(); + } + + public void getAllSubs(JTree tree, TreeItem o, List ret) { + TagTreeModel tm = (TagTreeModel) tree.getModel(); + for (TreeItem c : tm.getAllChildren(o)) { + ret.add(c); + getAllSubs(tree, c, ret); + } + } + + public List getAllSelected(TagTree tree) { + TreeSelectionModel tsm = tree.getSelectionModel(); + TreePath[] tps = tsm.getSelectionPaths(); + List ret = new ArrayList<>(); + if (tps == null) { + return ret; + } + + for (TreePath tp : tps) { + TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); + ret.add(treeNode); + getAllSubs(tree, treeNode, ret); + } + return ret; + } + + public List getSelected(JTree tree) { + if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { + return new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); + } + TreeSelectionModel tsm = tree.getSelectionModel(); + TreePath[] tps = tsm.getSelectionPaths(); + List ret = new ArrayList<>(); + if (tps == null) { + return ret; + } + + for (TreePath tp : tps) { + TreeItem treeNode = (TreeItem) tp.getLastPathComponent(); + ret.add(treeNode); + } + return ret; + } + + public List getSelection(SWF swf) { + List sel; + if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { + sel = getAllSelected(this); + } else { + sel = new ArrayList<>(mainPanel.folderPreviewPanel.selectedItems.values()); + } + return getSelection(swf, sel); + } + + public List getSelection(SWF swf, List sel) { + List ret = new ArrayList<>(); + for (TreeItem d : sel) { + if (d instanceof SWFList) { + continue; + } + if (d.getSwf() != swf) { + continue; + } + + if (d instanceof TagScript) { + Tag tag = ((TagScript) d).getTag(); + if (tag instanceof DoActionTag || tag instanceof DoInitActionTag) { + d = tag; + } + } + + if (d instanceof Tag || d instanceof ASMSource) { + TreeNodeType nodeType = TagTree.getTreeNodeType(d); + if (nodeType == TreeNodeType.IMAGE) { + ret.add(d); + } + if (nodeType == TreeNodeType.SHAPE) { + ret.add(d); + } + if (nodeType == TreeNodeType.MORPH_SHAPE) { + ret.add(d); + } + if (nodeType == TreeNodeType.BUTTON) { + ret.add(d); + } + if (nodeType == TreeNodeType.AS) { + ret.add(d); + } + if (nodeType == TreeNodeType.MOVIE) { + ret.add(d); + } + if (nodeType == TreeNodeType.SOUND) { + ret.add(d); + } + if (nodeType == TreeNodeType.BINARY_DATA) { + ret.add(d); + } + if (nodeType == TreeNodeType.TEXT) { + ret.add(d); + } + if (nodeType == TreeNodeType.FONT) { + ret.add(d); + } + if (nodeType == TreeNodeType.OTHER_TAG) { + if (d instanceof SymbolClassTypeTag) { + ret.add(d); + } + } + } + + if (d instanceof Frame) { + ret.add(d); + } + if (d instanceof ScriptPack) { + ret.add(d); + } + } + return ret; + } + + public List getTagsWithType(List list, TreeNodeType type) { + List ret = new ArrayList<>(); + for (AS3ClassTreeItem item : list) { + TreeNodeType ttype = getTreeNodeType(item); + if (type == ttype) { + ret.add(item); + } + } + return ret; + } + + public TreeItem getCurrentTreeItem() { + if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { + return mainPanel.folderPreviewPanel.selectedItems.entrySet().iterator().next().getValue(); + } + + TreeItem item = (TreeItem) getLastSelectedPathComponent(); + return item; + } + + public void updateSwfs(SWF[] swfs) { + TagTreeModel ttm = getModel(); + if (ttm != null) { + List> expandedNodes = View.getExpandedNodes(this); + ttm.updateSwf(null); // todo: honfika: update only the changed swfs, but there was an exception when i tried it + View.expandTreeNodes(this, expandedNodes); + } + } + + @Override + public TagTreeModel getModel() { + return (TagTreeModel) super.getModel(); + } + + public void expandRoot() { + TagTreeModel ttm = getModel(); + TreeItem root = ttm.getRoot(); + expandPath(new TreePath(new Object[]{root})); + } + + public void expandFirstLevelNodes() { + TagTreeModel ttm = getModel(); + TreeItem root = ttm.getRoot(); + int childCount = ttm.getChildCount(root); + for (int i = 0; i < childCount; i++) { + expandPath(new TreePath(new Object[]{root, ttm.getChild(root, i)})); + } + } + + public String getSelectionPathString() { + StringBuilder sb = new StringBuilder(); + TreePath path = getSelectionPath(); + if (path != null) { + boolean first = true; + for (Object p : path.getPath()) { + if (!first) { + sb.append("|"); + } + + first = false; + sb.append(p.toString()); + } + } + + return sb.toString(); + } + + public void setSelectionPathString(String pathStr) { + if (pathStr != null && pathStr.length() > 0) { + String[] path = pathStr.split("\\|"); + + TreePath tp = View.getTreePathByPathStrings(this, Arrays.asList(path)); + if (tp != null) { + // the current view is the Resources view, otherwise tp is null + mainPanel.setTagTreeSelectedNode((TreeItem) tp.getLastPathComponent()); + } + } + } +}